라이브러리가 -g로 컴파일되었는지 어떻게 알 수 있습니까?


103

x86 Linux에 컴파일 된 라이브러리가 있으며 디버깅 기호로 컴파일되었는지 여부를 빠르게 확인하고 싶습니다.

답변:


85

Linux에서 실행중인 경우 objdump --debugging. 라이브러리의 각 개체 파일에 대한 항목이 있어야합니다. 디버깅 기호가없는 개체 파일의 경우 다음과 같은 내용이 표시됩니다.

objdump --debugging libvoidincr.a
In archive libvoidincr.a:

voidincr.o:     file format elf64-x86-64

디버깅 기호가 있으면 출력이 훨씬 더 상세합니다.


5
이 또한 obdjump -W libreadelf -w lib. 후자는 더 구성 가능합니다. readelf (1) 맨 페이지를 참조하십시오.
przemoc

3
바이너리의 경우 (-g로 컴파일 된 파일 포함) objdump는 -gstabs로 컴파일하지 않는 한 "인식 된 디버깅 정보 없음"이라는 응답을 제공합니다. 이것은 인식 된 버그 인 것 같습니다.
Dan Hook

댄, 어떤 플랫폼에서 이것을 시도 했습니까?
swegi

사용 된 러시아어 : man objdump (1)에서 --debugging 플래그는 "파일에 저장된 STABS 및 IEEE 디버깅 형식 정보를 구문 분석하고 C와 유사한 구문을 사용하여 인쇄하려고 시도합니다. 이러한 형식이 모두 발견되지 않으면이 옵션이 대체됩니다. -W 옵션에서 파일의 DWARF 정보를 인쇄합니다. "
Matt McClellan

5
objdump -g를 사용하거나 사용하지 않고 컴파일 된 간단한 test.o에 대해 아무것도 제공하지 않으므로 g효과적으로 쓸모가 없습니다. Ubuntu 12.04, gcc 4.6.3, GNU objdump 2.22. nm -a더 유용 할 것 같습니다.
jw013 2013 년

89

제안 된 명령

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.


1
완벽하게 작동합니다. 첫 번째 CMAKE_BUILD_TYPE RELEASE를 사용하여 내 실행 파일에서이 명령을 시도했는데 명령이 비어 있습니다. 그런 다음 CMAKE_BUILD_TYPE DEBUG로 시도한 다음 상당히 많은 출력이 발생했습니다.
infoclogged aug

32

도움이 된 것은 :

gdb mylib.so

디버그 기호를 찾을 수 없을 때 인쇄합니다.

Reading symbols from mylib.so...(no debugging symbols found)...done.

또는 발견 된 경우 :

Reading symbols from mylib.so...done.

이전 답변 중 어느 것도 나에게 의미있는 결과를주지 못했습니다. 디버그 기호가없는 libs는 많은 출력을 제공했습니다.


고마워! 이것은 cmake와 함께 Android에서 clang 컴파일러를 사용하여 나를 위해 일했습니다. :)
Pär Nils Amsen

빠른 검사에 아주 좋습니다! * .o 개체 파일에서도 작동합니다.
Stephane Rolland

28

nm -a <lib> 디버그 기호를 포함하여 라이브러리의 모든 기호를 인쇄합니다.

따라서 nm <lib>와 의 출력을 비교할 수 있습니다. 다른 nm -a <lib>경우 lib에 디버그 기호가 포함되어 있습니다.


3
@Employed Russian 이것에 대해 자세히 설명해 주시겠습니까? 왜 잘못된 도구라고 생각하십니까? 작업을 수행하고 Linux에서도 수행합니다.
qrdl

커널 2.6.35, xxx-objdump, xxx-nm 기반 임베디드 리눅스에서도 잘 작동합니다.
agfe2 2014 년

nm -anm --debug-syms자명 한 별칭 이 있습니다 :-).
pevik

3
간단히 입력 diff <(nm <lib>) <(nm -a <lib>)하기 쉬운 DIFF 얻을
Aᴄʜᴇʀᴏɴғᴀɪʟ

17

OSX에서는 dsymutil -sdwarfdump.

를 사용 dsymutil -s <lib_file> | more하면 디버그 기호가있는 파일에서 소스 파일 경로를 볼 수 있지만 그렇지 않으면 함수 이름 만 볼 수 있습니다.


11
예를 들어, 출력에서 ​​찾을 내용에 대한 자세한 설명을 제공 할 수 있습니까 dsymutil -s? 출력의 존재는 디버그 기호로 빌드되었음을 의미합니까, 아니면 grepped해야합니까?
Mitch

12

이를 위해 objdump 를 사용할 수 있습니다 .

편집 : 맨 페이지에서 :

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

6

디버그 정보가 바이너리와 별개의 파일에 저장되는 경우, 즉 바이너리가 디버그 링크 섹션을 포함하는 경우 사용을 제안 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 매뉴얼의 별도 디버그 파일 을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.