Programing

프로그램이 디버그 기호로 컴파일되었는지 확인하는 방법은 무엇입니까?

crosscheck 2020. 11. 15. 10:55
반응형

프로그램이 디버그 기호로 컴파일되었는지 확인하는 방법은 무엇입니까?


이 질문에 이미 답변이 있습니다.

김프에서 일부 코드를 추적하고 싶으므로 디버그 기호가 활성화 된 김프가 필요합니다. 컴파일 중에 활성화했는지 여부가 기억 나지 않습니다. 프로그램을 다시 컴파일하지 않고 확인하는 방법은 무엇입니까?


Linux에서 file사용할 수 있습니다 objdump. 특히, 파일이 "제거됨"또는 "제거되지 않음"인지 여부와 objdump --syms유용한 출력 여부를 확인할 수 있습니다 (일반 빌드의 경우 "심볼 없음"으로 표시됨).


objdump --syms명령을 실행할 때 출력에 " 심볼 없음 "이상이 표시 됩니다 (최소한 커널 객체의 경우 ).

커널 객체 내부에 디버그 정보가 있는지 확인하려면 objdump명령 끝에 다음을 추가 할 수 있습니다 | grep debug..

이 문자열을 찾으면 커널 개체에 디버그 정보가 포함 된 것입니다. 그렇지 않다면 "깨끗한"커널 객체입니다.

디버그 정보 없이 컴파일 한 커널 모듈의 예 :

geertvc@jimi:~/mystuff/kernels/linux-3.12.6$ objdump --syms ./modules/lib/modules/3.12.6/kernel/drivers/i2c/busses/i2c-at91.ko | grep debug

내가 컴파일 한 동일한 커널 모듈의 예 디버그 정보 :

geertvc@jimi:~/mystuff/kernels/linux-3.12.6$ objdump --syms ./modules/lib/modules/3.12.6/kernel/drivers/i2c/busses/i2c-at91.ko | grep debug
00000000 l    d  .debug_frame   00000000 .debug_frame
00000000 l    d  .debug_info    00000000 .debug_info
00000000 l    d  .debug_abbrev  00000000 .debug_abbrev
00000000 l    d  .debug_loc     00000000 .debug_loc
00000000 l    d  .debug_aranges 00000000 .debug_aranges
00000000 l    d  .debug_ranges  00000000 .debug_ranges
00000000 l    d  .debug_line    00000000 .debug_line
00000000 l    d  .debug_str     00000000 .debug_str
00000010 l       .debug_frame   00000000 $d

보시다시피 첫 번째 출력은 아무것도 반환하지 않는 반면 두 번째 출력은 그 안에있는 행을 반환 debug합니다.

참고 : 제 경우에는 file명령이 디버그 및 비디 버그 케이스 모두 에서 "제거되지 않음"을 반환했습니다 . 그러나 커널 객체의 크기 차이는 현저합니다.

  • 약. 디버그 정보가없는 16k
  • 약. 디버그 정보가있는 137k

분명히 후자의 버전에는 내부에 디버그 정보가있었습니다.

내 질문 : file이러한 경우 명령이 신뢰할 수 있습니까? 내가 경험 한 것에서 나는 objdump --syms ... | grep debug명령에 의존합니다 .

참고 URL : https://stackoverflow.com/questions/3284112/how-to-check-if-program-was-compiled-with-debug-symbols

반응형