debugging LLDB -打印函数内部静态变量的内容

tkqqtvp1  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(105)

我有下面的代码,在静态类中定义了一个示例方法。

namepsace AAA { 
class BBB { 
   static BBB& Instance() { 
       static BBB bbb();
       return bbb;
   }
}

我想从代码中的任何断点打印静态对象bbb(因为它是静态的,所以应该在代码中的任何地方定义它)
如果我使用下面的命令查找符号,它会给我符号在二进制文件中的偏移量。但是,它可能不包括ASLR(地址空间布局随机化)偏移量。
ASLR偏移可以通过从二进制结构中的函数符号的偏移减去其地址来获得(假设函数和静态共享相同的ASLR)。
结果ASLR值应该加到符号的偏移量上,以获得它在进程存储器中的真实的位置。
我想知道是否有更简单的方法来找到这个静态变量的内存位置?如果没有话,也许有办法使这个指令集自动化?
谢谢

lskq00tm

lskq00tm1#

调试器中的函数静态有两个问题。
首先,它们很难找到,因为你必须深入挖掘调试信息,所以“请为我找到一个函数静态”请求需要有某种范围,否则它在大型应用程序中会表现得很糟糕。
所以我们需要在这里做一些观察。第二个问题是,尽管符号名可以传达该作用域,但函数静态的非标准名称不是 C++ 可以解析为获取值的有效代码的标识符。所以你不能在表达式解析器中使用它们。
lldb应该在target variable命令中添加更多的语法来指定函数作用域,这将非常简单,并允许您指定作用域。这经常作为增强请求出现,但还没有达到激活能量......
然而,这些静态变量仍然有混乱的名称,当它们出现在表达式中时,lldb的表达式解析器将根据混乱的名称查找符号。这里的一个技巧是,裸符号没有类型,只有地址。所以你必须提供类型。但那很容易做到。。
在您的示例中(我将名称从bbb更改为local_bbb,以便更容易找到),首先我必须找到损坏的名称:

(lldb) image dump symtab <binary_name> -m
...
[   26]    115 D X Data            0x0000000100008000 0x0000000100008000 0x0000000000000020 0x000f0080 _ZZN3AAA3BBB8InstanceEvE9local_bbb

[   27]    116 D X Data            0x0000000100008020 0x0000000100008020 0x0000000000000008 0x000f0080 _ZGVZN3AAA3BBB8InstanceEvE9local_bbb

有两个有点奇怪,为什么?

(lldb) lang cplus demangle _ZGVZN3AAA3BBB8InstanceEvE9local_bbb
_ZGVZN3AAA3BBB8InstanceEvE9local_bbb ---> guard variable for AAA::BBB::Instance()::local_bbb

啊,那是设置静电干扰的保护变量。所以我们想要另一个。然后我可以使用强制转换来访问该符号,以提供类型信息:

(lldb) expr (AAA::BBB &) _ZZN3AAA3BBB8InstanceEvE9local_bbb
(AAA::BBB) $2 = (an_int = 200, a_string = "some value")

我还添加了一些字段来显示我们得到的值是正确的。因为lldb的处理从符号名称到地址,它将为您获得正确的ASLR幻灯片。

相关问题