Tenho algumas bibliotecas compiladas em x86 Linux e quero determinar rapidamente se elas foram compiladas com símbolos de depuração.
c
debugging
gdb
debug-symbols
Dan Hook
fonte
fonte
obdjump -W lib
ereadelf -w lib
. O último é mais configurável - consulte a página de manual readelf (1).objdump -g
não me dá nada para um simples test.o compilado com e semg
, tornando-o efetivamente inútil. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22.nm -a
parece ser mais útil.O comando sugerido
me dá sempre o mesmo resultado pelo menos no Ubuntu / Linaro 4.5.2:
não importa se o arquivo / biblioteca compartilhada foi construído com ou sem
-g
opçãoO que realmente me ajudou a determinar se
-g
foi usada foi a ferramenta readelf :ou
Isso imprimirá um conjunto de linhas que consiste no nome do arquivo de origem, número da linha e endereço se tais informações de depuração estiverem incluídas na biblioteca , caso contrário, não imprimirá nada .
Você pode passar qualquer valor que achar necessário para a
--debug-dump
opção em vez dedecodedline
.fonte
O que ajudou é:
Ele é impresso quando os símbolos de depuração não são encontrados:
Ou quando encontrado:
Nenhuma das respostas anteriores estava dando resultados significativos para mim: libs sem símbolos de depuração estavam fornecendo muitos resultados, etc.
fonte
nm -a <lib>
irá imprimir todos os símbolos da biblioteca, incluindo os de depuração.Assim, você pode comparar as saídas de
nm <lib>
enm -a <lib>
- se forem diferentes, seu lib contém alguns símbolos de depuração.fonte
nm -a
tem aliasnm --debug-syms
que é autoexplicativo :-).diff <(nm <lib>) <(nm -a <lib>)
para obter uma diferença fácilNo OSX você pode usar
dsymutil -s
edwarfdump
.Usando,
dsymutil -s <lib_file> | more
você verá os caminhos dos arquivos de origem em arquivos que possuem símbolos de depuração, mas apenas os nomes das funções.fonte
dsymutil -s
,? A existência de saída significa que foi construída com símbolos de depuração ou deve ser grepped?Você pode usar objdump para isso.
EDIT: Da página man:
fonte
Respostas sugerindo o uso de
objdump --debugging
oureadelf --debug-dump=...
não funcionam no caso de as informações de depuração serem armazenadas em um arquivo separado do binário, ou seja, o binário contém uma seção de link de depuração . Talvez alguém possa chamar isso de bug emreadelf
.O código a seguir deve lidar com isso corretamente:
Consulte Arquivos de depuração separados no manual do GDB para obter mais informações.
fonte