对于下面的代码,在由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;
}
答案 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这样的调试器可以通过从下级读取内存来查找运行时的长度,就像你的程序一样。