2014-12-31 3 views
3

-g를 사용하여 프로그램을 컴파일하고 코어 덤프를 얻을 때 gdb을 사용하여 프로그램이 충돌하기 전에 프로그램이 실행되는 상황을 디버깅하기 위해 실행 파일과 코어 덤프를 읽을 수 있습니다. gdb 기능 중 하나는 list 옵션이며, 실행 파일과 코어 덤프를 사용하여 컴파일 된 소스 코드를 나열 할 수 있습니다. 실행 파일과 코어 덤프를 가지고 strings -a을 사용했는데 코드가 많다고 확신하는 동안 if 또는 for 문도 찾을 수 없었습니다. 그렇다면 코드는 어디에서 오는 것입니까? 한 컴퓨터에서 코드를 컴파일하고 다른 코드에서 실행하므로 코어 덤프가 생성되는 컴퓨터에서 소스 코드를 사용할 수 없으며 실행 파일이나 코어 덤프 내에 있지 않은 것 같습니다. 어떤 제안? 실행 파일과 코어 덤프에서 모든 소스 코드를 인쇄하고 싶습니다. 가능합니까? gdb을 실행하지 않고서도 gdb를 사용하는 스크립트를 작성하는 것이 가능하며 전체 코드를 나열 할 수 있지만 gdb없이 직접 처리하는 것에 관심이 있습니다. 소스 코드를 가져온 위치를 이해하고 싶기 때문입니다. 어떻게 형식화 되었는가, 나는 가능한 한 많이 알고 싶다.gdb는 어디에서 코드 행을 가져 옵니까?

+0

디버깅 정보에는 여러 가지 형식이 있습니다. 직접 액세스하는 방법은 어떤 형식이 사용되었는지에 달려 있습니다. –

답변

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