如何从DWARF中获取字符串或数组的长度?

时间:2016-10-05 22:04:38

标签: dwarf

对于下面的代码,在由GCC编译之后,是否可以从DWARF中导出“teststr”和“testarray”变量的长度?

void func(char *str1, char *str2){
     ...
     ...
     return;
}

int main(void){
     char *teststr = "123456";
     char testarray[6] = "123456";

     func(teststr, testarray);     
     ....
     ....

     return 0;
}

1 个答案:

答案 0 :(得分:0)

DWARF几乎代表了编译器对源程序的了解。所以这个问题的一般答案是:如果你能在源中找到“本地”的大小,那么是;否则没有。

但是在这种情况下,如果我们从您的程序中删除TraceLoggerFactory并编译它,我们可以直接使用TraceLogger读取DWARF。

以下是...readelf的内容:

testarray

也就是说,它是一个包含6个字符的数组。因此,在这种情况下,您可以找到长度 - 正是您对阅读源的期望。

然而,main <2><5c>: Abbrev Number: 3 (DW_TAG_variable) <5d> DW_AT_name : (indirect string, offset: 0x5): testarray <61> DW_AT_decl_file : 1 <62> DW_AT_decl_line : 7 <63> DW_AT_type : <0x7f> <67> DW_AT_location : 2 byte block: 91 60 (DW_OP_fbreg: -32) ... <1><7f>: Abbrev Number: 7 (DW_TAG_array_type) <80> DW_AT_type : <0x78> <84> DW_AT_sibling : <0x8f> <2><88>: Abbrev Number: 8 (DW_TAG_subrange_type) <89> DW_AT_type : <0x8f> <8d> DW_AT_upper_bound : 5 <2><8e>: Abbrev Number: 0 <1><8f>: Abbrev Number: 6 (DW_TAG_base_type) <90> DW_AT_byte_size : 8 <91> DW_AT_encoding : 7 (unsigned) <92> DW_AT_name : (indirect string, offset: 0x60): sizetype 中的变量看起来更像:

teststr

这说它只是一个指向char的指针 - 换句话说,长度不是静态知道的。像gdb这样的调试器可以通过从下级读取内存来查找运行时的长度,就像你的程序一样。