DWARF定义了调试信息格式,调试信息项debugging information entries (DIE)是.debug_*段的信息, 结合行号项是符号源码级别调试必须的。 我们来实际看看到底有什么东东。
例子程序:
#include <stdio.h>
struct my_s {
int a;
char c;
};
struct my_s myidea = {0};
void do_stuff(int my_arg)
{
int i;
int my_local = my_arg + 2;
for (i = 0; i < my_local; ++i)
printf("i = %d\n", i);
}
int main()
{
do_stuff(2);
return 0;
}
gcc -g dd.c -o dd
readelf -a dd, 可以看到多出了一些调试段,
[27] .debug_aranges PROGBITS 0000000000000000 00000968
0000000000000030 0000000000000000 0 0 1
[28] .debug_info PROGBITS 0000000000000000 00000998
00000000000000e0 0000000000000000 0 0 1
[29] .debug_abbrev PROGBITS 0000000000000000 00000a78
0000000000000089 0000000000000000 0 0 1
[30] .debug_line PROGBITS 0000000000000000 00000b01
000000000000004f 0000000000000000 0 0 1
[31] .debug_str PROGBITS 0000000000000000 00000b50
00000000000000a5 0000000000000001 MS 0 0 1
[32] .debug_loc PROGBITS 0000000000000000 00000bf5
00000000000000c0 0000000000000000 0 0 1
objdump -Wi dd
<1><72>: Abbrev Number: 4 (DW_TAG_structure_type)
<73> DW_AT_name : (indirect string, offset: 0x7c): my_s
<77> DW_AT_byte_size : 8
<78> DW_AT_decl_file : 1
<79> DW_AT_decl_line : 3
<7a> DW_AT_sibling : <0x97>
<2><7e>: Abbrev Number: 5 (DW_TAG_member)
<7f> DW_AT_name : a
<81> DW_AT_decl_file : 1
<82> DW_AT_decl_line : 4
<83> DW_AT_type : <0x4f>
<87> DW_AT_data_member_location: 2 byte block: 23 0 (DW_OP_plus_uconst: 0)
<2><8a>: Abbrev Number: 5 (DW_TAG_member)
<8b> DW_AT_name : c
<8d> DW_AT_decl_file : 1
<8e> DW_AT_decl_line : 5
<8f> DW_AT_type : <0x6b>
<93> DW_AT_data_member_location: 2 byte block: 23 4 (DW_OP_plus_uconst: 4)
<1><97>: Abbrev Number: 6 (DW_TAG_subprogram)
<98> DW_AT_external : 1
<99> DW_AT_name : (indirect string, offset: 0x4d): do_stuff
<9d> DW_AT_decl_file : 1
<9e> DW_AT_decl_line : 8
<9f> DW_AT_prototyped : 1
<a0> DW_AT_low_pc : 0x1000043c
<a4> DW_AT_high_pc : 0x100004bc
<a8> DW_AT_frame_base : 0x0 (location list)
<ac> DW_AT_sibling : <0xd9>
<2><b0>: Abbrev Number: 7 (DW_TAG_formal_parameter)
<b1> DW_AT_name : (indirect string, offset: 0x75): my_arg
<b5> DW_AT_decl_file : 1
<b6> DW_AT_decl_line : 8
<b7> DW_AT_type : <0x4f>
<bb> DW_AT_location : 2 byte block: 91 68 (DW_OP_fbreg: -24)
<2><be>: Abbrev Number: 8 (DW_TAG_variable)
<bf> DW_AT_name : i
<c1> DW_AT_decl_file : 1
<c2> DW_AT_decl_line : 10
<c3> DW_AT_type : <0xd9>
<c7> DW_AT_location : 2 byte block: 91 58 (DW_OP_fbreg: -40)
<2><ca>: Abbrev Number: 9 (DW_TAG_variable)
<cb> DW_AT_name : (indirect string, offset: 0x21): my_local
<cf> DW_AT_decl_file : 1
<d0> DW_AT_decl_line : 11
<d1> DW_AT_type : <0xd9>
<d5> DW_AT_location : 2 byte block: 91 5c (DW_OP_fbreg: -36)
<1><d9>: Abbrev Number: 10 (DW_TAG_volatile_type)
<da> DW_AT_type : <0x4f>
<1><de>: Abbrev Number: 11 (DW_TAG_subprogram)
<df> DW_AT_external : 1
<e0> DW_AT_name : (indirect string, offset: 0x69): main
<e4> DW_AT_decl_file : 1
<e5> DW_AT_decl_line : 17
<e6> DW_AT_type : <0x4f>
<ea> DW_AT_low_pc : 0x100004bc
<ee> DW_AT_high_pc : 0x100004f8
<f2> DW_AT_frame_base : 0x44 (location list)
<1><f6>: Abbrev Number: 12 (DW_TAG_variable)
<f7> DW_AT_name : (indirect string, offset: 0x6e): myidea
<fb> DW_AT_decl_file : 1
<fc> DW_AT_decl_line : 7
<fd> DW_AT_type : <0x72>
<101> DW_AT_external : 1
<102> DW_AT_location : 5 byte block: 3 10 1 8 44 (DW_OP_addr: 10010844)
Debugging Information Entry (DIE).每个DIE有自己的标签 –- 它的类型, 一系列的属性.DIEs通过兄弟和儿子互联,属性值可以指向其他的DIE.