J'ai quelques bibliothèques compilées sur Linux x86 et je veux déterminer rapidement si elles ont été compilées avec des symboles de débogage.
Si vous utilisez Linux, utilisez objdump --debugging
. Il devrait y avoir une entrée pour chaque fichier objet dans la bibliothèque. Pour les fichiers objets sans symboles de débogage, vous verrez quelque chose comme:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
S'il y a des symboles de débogage, la sortie sera beaucoup plus détaillée.
La commande suggérée
objdump --debugging libinspected.a
objdump --debugging libinspected.so
me donne toujours le même résultat au moins sur Ubuntu/Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
que l'archive/la bibliothèque partagée ait été construite avec ou sans -g
option
Ce qui m'a vraiment aidé à déterminer si -g
a été utilisé est readelf outil:
readelf --debug-dump=decodedline libinspected.so
ou
readelf --debug-dump=line libinspected.so
Cela imprimera un ensemble de lignes composé du nom du fichier source, du numéro de ligne et de l'adresse si ces informations de débogage sont incluses dans la bibliothèque , sinon elles seront imprimées rien .
Vous pouvez transmettre la valeur que vous jugerez nécessaire pour --debug-dump
option au lieu de decodedline
.
nm -a <lib>
imprimera tous les symboles de la bibliothèque, y compris ceux de débogage.
Vous pouvez donc comparer les sorties de nm <lib>
et nm -a <lib>
- s'ils diffèrent, votre lib contient des symboles de débogage.
Ce qui a aidé, c'est:
gdb mylib.so
Il s'imprime lorsque les symboles de débogage ne sont pas trouvés:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Ou une fois trouvé:
Reading symbols from mylib.so...done.
Aucune des réponses précédentes ne donnait de résultats significatifs pour moi: les bibliothèques sans symboles de débogage donnaient beaucoup de sortie, etc.
Sous OSX, vous pouvez utiliser dsymutil -s
et dwarfdump
.
En utilisant dsymutil -s <lib_file> | more
vous verrez les chemins d'accès aux fichiers source dans les fichiers qui ont des symboles de débogage, mais uniquement les noms des fonctions sinon.
Vous pouvez utiliser objdump pour cela.
EDIT: À partir de la page de manuel:
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
Réponses suggérant l'utilisation de objdump --debugging
ou readelf --debug-dump=...
ne fonctionne pas dans le cas où les informations de débogage sont stockées dans un fichier séparé du binaire, c'est-à-dire que le binaire contient une section lien de débogage . On pourrait peut-être appeler cela un bogue dans readelf
.
Le code suivant doit gérer cela correctement:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Voir Fichiers de débogage séparés dans le manuel GDB pour plus d'informations.