我有下面的代码,在静态类中定义了一个示例方法。
namepsace AAA {
class BBB {
static BBB& Instance() {
static BBB bbb();
return bbb;
}
}
我想从代码中的任何断点打印静态对象bbb
(因为它是静态的,所以应该在代码中的任何地方定义它)
如果我使用下面的命令查找符号,它会给我符号在二进制文件中的偏移量。但是,它可能不包括ASLR(地址空间布局随机化)偏移量。
ASLR偏移可以通过从二进制结构中的函数符号的偏移减去其地址来获得(假设函数和静态共享相同的ASLR)。
结果ASLR值应该加到符号的偏移量上,以获得它在进程存储器中的真实的位置。
我想知道是否有更简单的方法来找到这个静态变量的内存位置?如果没有话,也许有办法使这个指令集自动化?
谢谢
1条答案
按热度按时间lskq00tm1#
调试器中的函数静态有两个问题。
首先,它们很难找到,因为你必须深入挖掘调试信息,所以“请为我找到一个函数静态”请求需要有某种范围,否则它在大型应用程序中会表现得很糟糕。
所以我们需要在这里做一些观察。第二个问题是,尽管符号名可以传达该作用域,但函数静态的非标准名称不是 C++ 可以解析为获取值的有效代码的标识符。所以你不能在表达式解析器中使用它们。
lldb应该在
target variable
命令中添加更多的语法来指定函数作用域,这将非常简单,并允许您指定作用域。这经常作为增强请求出现,但还没有达到激活能量......然而,这些静态变量仍然有混乱的名称,当它们出现在表达式中时,lldb的表达式解析器将根据混乱的名称查找符号。这里的一个技巧是,裸符号没有类型,只有地址。所以你必须提供类型。但那很容易做到。。
在您的示例中(我将名称从
bbb
更改为local_bbb
,以便更容易找到),首先我必须找到损坏的名称:有两个有点奇怪,为什么?
啊,那是设置静电干扰的保护变量。所以我们想要另一个。然后我可以使用强制转换来访问该符号,以提供类型信息:
我还添加了一些字段来显示我们得到的值是正确的。因为lldb的处理从符号名称到地址,它将为您获得正确的ASLR幻灯片。