Comment puis-je savoir si une bibliothèque a été compilée avec -g?


103

J'ai quelques bibliothèques compilées sous Linux x86 et je veux déterminer rapidement si elles ont été compilées avec des symboles de débogage.

Réponses:


85

Si vous utilisez Linux, utilisez objdump --debugging. Il doit 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.


5
Il y a aussi obdjump -W libet readelf -w lib. Ce dernier est plus configurable - voir la page de manuel readelf (1).
przemoc

3
Pour tout binaire, (y compris ceux compilés avec -g) objdump me donne la réponse "aucune information de débogage reconnue" à moins que je ne le compile avec -gstabs. Cela semble être un bogue reconnu.
Dan Hook

Dan, sur quelle plateforme avez-vous essayé ça?
swegi

Employé russe: à partir de man objdump (1), l'indicateur --debugging "tente d'analyser les informations de format de débogage STABS et IEEE stockées dans le fichier et de les imprimer en utilisant une syntaxe de type C. Si aucun de ces formats n'est trouvé, cette option est rétablie sur l'option -W pour imprimer les informations DWARF dans le fichier. "
Matt McClellan

5
objdump -gne me donne rien pour un simple test.o compilé avec et sans g, ce qui le rend effectivement inutile. Ubuntu 12.04, gcc 4.6.3, objdump GNU 2.22. nm -asemble être plus utile.
jw013

89

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

peu importe si l'archive / la bibliothèque partagée a été construite avec ou sans -goption

Ce qui m'a vraiment aidé à déterminer si a -gété utilisé est l' outil Readelf :

readelf --debug-dump=decodedline libinspected.so

ou

readelf --debug-dump=line libinspected.so

Cela imprimera un ensemble de lignes comprenant le nom du fichier source, le numéro de ligne et l'adresse si de telles informations de débogage sont incluses dans la bibliothèque , sinon cela n'imprimera rien .

Vous pouvez passer la valeur que vous jugerez nécessaire pour l' --debug-dumpoption au lieu de decodedline.


1
fonctionne parfaitement. J'ai essayé cette commande sur mon exécutable avec le premier CMAKE_BUILD_TYPE RELEASE et la commande est retournée vide. Ensuite, j'ai essayé avec CMAKE_BUILD_TYPE DEBUG et puis il y avait beaucoup de sortie.
enregistré

32

Ce qui a aidé 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 résultats, etc.


THX! Cela a fonctionné pour moi, en utilisant le compilateur clang sous Android avec cmake :)
Pär Nils Amsen

super super pour une vérification rapide! fonctionne également sur les fichiers objets * .o.
Stephane Rolland le

28

nm -a <lib> affichera 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>- si elles diffèrent, votre bibliothèque contient des symboles de débogage.


3
@Employed Russian Pouvez-vous nous en dire plus? Pourquoi pensez-vous que c'est un mauvais outil? Il fait le travail, et le fait également sous Linux.
qrdl

Même pour Linux embarqué basé sur le noyau 2.6.35, xxx-objdump, xxx-nm fonctionne bien.
agfe2

nm -aa un alias nm --debug-symsqui est explicite :-).
pevik

3
Tapez simplement diff <(nm <lib>) <(nm -a <lib>)pour obtenir une différence facile
Aᴄʜᴇʀᴏɴғᴀɪʟ

17

Sur OSX, vous pouvez utiliser dsymutil -set dwarfdump.

En utilisant, dsymutil -s <lib_file> | morevous verrez les chemins des fichiers source dans les fichiers qui ont des symboles de débogage, mais uniquement les noms de fonction sinon.


11
Pouvez-vous fournir une explication sur ce qu'il faut rechercher dans la sortie, par exemple dsymutil -s? L'existence de la sortie signifie-t-elle qu'elle a été construite avec des symboles de débogage, ou doit-elle être greffée?
Mitch

12

Vous pouvez utiliser objdump pour cela.

EDIT: Depuis la page de manuel:

-W
--dwarf
Displays  the  contents of the DWARF debug sections in the file, if
any are present.

6

Réponses suggérant l'utilisation objdump --debuggingou readelf --debug-dump=...ne fonctionnant 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 de lien de débogage . On pourrait peut-être appeler cela un bug 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.