-g를 사용하여 프로그램을 컴파일하고 코어 덤프를 얻을 때 gdb
을 사용하여 프로그램이 충돌하기 전에 프로그램이 실행되는 상황을 디버깅하기 위해 실행 파일과 코어 덤프를 읽을 수 있습니다. gdb
기능 중 하나는 list
옵션이며, 실행 파일과 코어 덤프를 사용하여 컴파일 된 소스 코드를 나열 할 수 있습니다. 실행 파일과 코어 덤프를 가지고 strings -a
을 사용했는데 코드가 많다고 확신하는 동안 if
또는 for
문도 찾을 수 없었습니다. 그렇다면 코드는 어디에서 오는 것입니까? 한 컴퓨터에서 코드를 컴파일하고 다른 코드에서 실행하므로 코어 덤프가 생성되는 컴퓨터에서 소스 코드를 사용할 수 없으며 실행 파일이나 코어 덤프 내에 있지 않은 것 같습니다. 어떤 제안? 실행 파일과 코어 덤프에서 모든 소스 코드를 인쇄하고 싶습니다. 가능합니까? gdb
을 실행하지 않고서도 gdb를 사용하는 스크립트를 작성하는 것이 가능하며 전체 코드를 나열 할 수 있지만 gdb
없이 직접 처리하는 것에 관심이 있습니다. 소스 코드를 가져온 위치를 이해하고 싶기 때문입니다. 어떻게 형식화 되었는가, 나는 가능한 한 많이 알고 싶다.gdb는 어디에서 코드 행을 가져 옵니까?
3
A
답변
3
라인 정보는 실행 파일의 .debug_line
DWARF 섹션에 있습니다
$readelf -wL ./a.out
Decoded dump of debug contents of section .debug_line:
CU: bla.c:
File name Line number Starting address
bla.c 2 0x4004b6
bla.c 3 0x4004ba
bla.c 4 0x4004bf
이 섹션에서는 주어진 파일에 숫자를 일렬로 명령 포인터 주소를 매핑합니다.
파일 내용을 찾으려면 관련 원본 파일을 찾을 수 있어야합니다. 당신이 이동하는 경우/소스 파일의 이름을 변경, GDB가 소스 코드를 인쇄 할 수 없습니다 :
mv bla.c bla2.c gdb ./a.out (gdb) break main (gdb) run (gdb) list 1 in bla.c
.debug_info
DWARF 섹션
$objdump -Wi -wa ./a.out ./a.out: file format elf64-x86-64 ./a.out Contents of the .debug_info section: Compilation Unit @ offset 0x0: Length: 0x4e (32-bit) Version: 4 Abbrev Offset: 0x0 Pointer Size: 8 : Abbrev Number: 1 (DW_TAG_compile_unit) DW_AT_producer : (indirect string, offset: 0x0): GNU C 4.9.1 -mtune=generic -march=x86-64 -g DW_AT_language : 1 (ANSI C) DW_AT_name : (indirect string, offset: 0x59): bla.c DW_AT_comp_dir : (indirect string, offset: 0x31): /home/myself/temp/bla DW_AT_low_pc : 0x4004b6 DW_AT_high_pc : 0xb DW_AT_stmt_list : 0x0 : Abbrev Number: 2 (DW_TAG_subprogram) DW_AT_external : 1 DW_AT_name : (indirect string, offset: 0x2c): main DW_AT_decl_file : 1 DW_AT_decl_line : 2 DW_AT_type : DW_AT_low_pc : 0x4004b6 DW_AT_high_pc : 0xb DW_AT_frame_base : 1 byte block: 9c (DW_OP_call_frame_cfa) DW_AT_GNU_all_call_sites: 1 : Abbrev Number: 3 (DW_TAG_base_type) DW_AT_byte_size : 4 DW_AT_encoding : 5 (signed) DW_AT_name : int : Abbrev Number: 0
각 DW_TAG_compile_unit
는 관련 소스 파일을 찾을하는 데 사용되는 소스 파일 이름과 경로에 대한 정보가 있습니다.
직접 작성하고 싶다면 DWARF specifications의 관련 부분을 읽고 libdw (elfutils의 일부)와 같은 라이브러리를 사용해야합니다.
+0
고마워, 너는 서클에서 달리기 며칠을 구해줬다. 해피 뉴 이어 @ysdx! – e271p314
디버깅 정보에는 여러 가지 형식이 있습니다. 직접 액세스하는 방법은 어떤 형식이 사용되었는지에 달려 있습니다. –