Respostas:
Se você estiver executando no Linux, use objdump --debugging
. Deve haver uma entrada para cada arquivo de objeto na biblioteca. Para arquivos de objeto sem símbolos de depuração, você verá algo como:
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
Se houver símbolos de depuração, a saída será muito mais detalhada.
objdump -g
não me dá nada para um simples test.o compilado com e sem g
, 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
objdump --debugging libinspected.a
objdump --debugging libinspected.so
me dá sempre o mesmo resultado pelo menos no Ubuntu / Linaro 4.5.2:
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
não importa se o arquivo / biblioteca compartilhada foi construído com ou sem -g
opção
O que realmente me ajudou a determinar se -g
foi usada foi a ferramenta readelf :
readelf --debug-dump=decodedline libinspected.so
ou
readelf --debug-dump=line libinspected.so
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 de decodedline
.
O que ajudou é:
gdb mylib.so
Ele é impresso quando os símbolos de depuração não são encontrados:
Reading symbols from mylib.so...(no debugging symbols found)...done.
Ou quando encontrado:
Reading symbols from mylib.so...done.
Nenhuma das respostas anteriores estava dando resultados significativos para mim: libs sem símbolos de depuração estavam fornecendo muitos resultados, etc.
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>
e nm -a <lib>
- se forem diferentes, seu lib contém alguns símbolos de depuração.
nm -a
tem alias nm --debug-syms
que é autoexplicativo :-).
diff <(nm <lib>) <(nm -a <lib>)
para obter uma diferença fácil
No 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.
dsymutil -s
,? A existência de saída significa que foi construída com símbolos de depuração ou deve ser grepped?
Respostas sugerindo o uso de objdump --debugging
ou readelf --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:
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
Consulte Arquivos de depuração separados no manual do GDB para obter mais informações.
obdjump -W lib
ereadelf -w lib
. O último é mais configurável - consulte a página de manual readelf (1).