x86 Linux에 컴파일 된 라이브러리가 있으며 디버깅 기호로 컴파일되었는지 여부를 빠르게 확인하고 싶습니다.
답변
Linux에서 실행중인 경우 objdump --debugging
. 라이브러리의 각 개체 파일에 대한 항목이 있어야합니다. 디버깅 기호가없는 개체 파일의 경우 다음과 같은 내용이 표시됩니다.
objdump --debugging libvoidincr.a
In archive libvoidincr.a:
voidincr.o: file format elf64-x86-64
디버깅 기호가 있으면 출력이 훨씬 더 상세합니다.
답변
제안 된 명령
objdump --debugging libinspected.a
objdump --debugging libinspected.so
적어도 Ubuntu / Linaro 4.5.2에서 항상 동일한 결과를 제공합니다.
libinspected.a: file format elf64-x86-64
libinspected.so: file format elf64-x86-64
아카이브 / 공유 라이브러리가 -g
옵션 이 있든 없든 관계없이
-g
사용 여부를 결정하는 데 정말 도움 이 된 것은 readelf 도구입니다.
readelf --debug-dump=decodedline libinspected.so
또는
readelf --debug-dump=line libinspected.so
소스 파일 이름, 줄 번호, 주소 등의 디버그 정보가 라이브러리에 포함되어 있으면 줄 집합을 인쇄하고 , 그렇지 않으면 아무 것도 인쇄 하지 않습니다 .
--debug-dump
대신 옵션에 필요한 값을 전달할 수 있습니다 decodedline
.
답변
도움이 된 것은 :
gdb mylib.so
디버그 기호를 찾을 수 없을 때 인쇄합니다.
Reading symbols from mylib.so...(no debugging symbols found)...done.
또는 발견 된 경우 :
Reading symbols from mylib.so...done.
이전 답변 중 어느 것도 나에게 의미있는 결과를주지 못했습니다. 디버그 기호가없는 libs는 많은 출력을 제공했습니다.
답변
nm -a <lib>
디버그 기호를 포함하여 라이브러리의 모든 기호를 인쇄합니다.
따라서 nm <lib>
와 의 출력을 비교할 수 있습니다. 다른 nm -a <lib>
경우 lib에 디버그 기호가 포함되어 있습니다.
답변
OSX에서는 dsymutil -s
및 dwarfdump
.
를 사용 dsymutil -s <lib_file> | more
하면 디버그 기호가있는 파일에서 소스 파일 경로를 볼 수 있지만 그렇지 않으면 함수 이름 만 볼 수 있습니다.
답변
이를 위해 objdump 를 사용할 수 있습니다 .
편집 : 맨 페이지에서 :
-W
--dwarf
Displays the contents of the DWARF debug sections in the file, if
any are present.
답변
디버그 정보가 바이너리와 별개의 파일에 저장되는 경우, 즉 바이너리가 디버그 링크 섹션을 포함하는 경우 사용을 제안 objdump --debugging
하거나 readelf --debug-dump=...
작동하지 않는 답변 입니다. 아마도 그것을 .readelf
다음 코드는이를 올바르게 처리해야합니다.
# Test whether debug information is available for a given binary
has_debug_info() {
readelf -S "$1" | grep -q " \(.debug_info\)\|\(.gnu_debuglink\) "
}
자세한 내용 은 GDB 매뉴얼의 별도 디버그 파일 을 참조하십시오.