[英]How does gdb find the address of a variable in anonymous namespace
我在 C++ 文件中声明了一个变量,如下所示:
namespace {
VelocityLongitudinal vel_lgt;
}
对应的矮人信息是
<1><5e08b>: Abbrev Number: 317 (DW_TAG_namespace)
<5e08d> DW_AT_sibling : <0x5e09e>
<2><5e091>: Abbrev Number: 193 (DW_TAG_variable)
<5e093> DW_AT_name : (indirect string, offset: 0xa5582): vel_lgt
<5e097> DW_AT_decl_file : 2
<5e098> DW_AT_decl_line : 19
<5e099> DW_AT_type : <0x5bed3>
<5e09d> DW_AT_declaration : 1
<2><5e09d>: Abbrev Number: 0
我们看到没有 DW_AT_linkage_name 和 DW_AT_location
在符号表(readelf -s)中我找到了。 地址 21a0a0 与 gdb 报告的地址相匹配(print &'(anonymous namespace)::vel_lgt')
42: 0000000000000000 0 FILE LOCAL DEFAULT ABS vehiclemotionstate_server
43: 000000000021a0a0 24 OBJECT LOCAL DEFAULT 2 _ZN12_GLOBAL__N_17vel_lgt
gdb 是如何找到的? Vehiclemotionstate_serve.cpp 是声明变量的文件的名称。 gdb 似乎不太可能在某个 cpp 文件的符号表条目中搜索与最后一个字符匹配的条目。 如果是这样,它如何区分同名文件中两个不同的同名声明?
gdb 是如何找到的?
通过读取符号表(相当于readelf -s
所做的),以及读取调试信息。
gdb 似乎不太可能搜索与最后一个字符匹配的条目
它没有。 这个名字你发现demangles到(anonymous namespace)::vel_lgt
(除非你似乎已经做出了剪切/粘贴错误:实际名称应该是_ZN12_GLOBAL__N_17vel_lgtE
)。
它如何区分同名文件中两个不同的同名声明?
如果你问,它会告诉你有不止一个实例,例如
(gdb) info var vel_lgt
All variables matching regular expression "vel_lgt":
File t.cc:
2: static int (anonymous namespace)::vel_lgt;
File t1.cc:
2: static int (anonymous namespace)::vel_lgt;
请注意,它实际上是相当困难告诉GDB这两个实例的打印- print vel_lgt
只是打印第一个,有没有简单的方法来索要另一个。 我相信有一个关于此的开放 GDB 错误,但我找不到它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.