555558ed2000-55555ed43000 rw-p 00000000 00:00 0 [heap]
因此,有了
gdb
很容易找到对这些价值的引用,并且可以肯定的是,有4个:
(gdb) find 0x555558ed2000, 0x55555ed43000, 95000
0x55555c3f0744
0x55555deb7f50
0x55555deb8b60
0x55555deb9800
我无法访问调试符号,但是我所拥有的是一个参考,它告诉我以95000值的值告诉场地。它是0x570,因此从任何匹配中都从任何匹配中减去它(让我们拿第一个)给我对象的地址。
0x55555c3f0744 - 0x570 = 0x55555c3f01d4
由于这是一个动态的数组,内存中必须有某个地方将该价值视为指针,并且我有兴趣查找。我已经尝试了一些事情,主要是其中的变体,它们在堆中搜索该值,但是我还没有完全管理它(我认为需要
/g
修饰符,因为指针为8个字节):(gdb) find /g 0x555558ed2000, 0x55555ed43000 - 0x8, 0x55555c3f01d4
Pattern not found.
thementhing在绊倒我,我不知道什么。这里有什么问题?我的推理有问题吗?
基本上,编译器生成的对象代码已高度优化。因此,即使对某个地址的偏移是远离“基础地址”的偏移,也不一定意味着编译器生成的对象或在运行时动态创建的内存图像实际上包含“基础地址”
0x570
,是从发现的地址减去的。
如果可能的话,请尝试在编译目标可执行文件并通过汇编源进行搜索时生成汇编源。如果您可以找到处理所需的动态阵列的汇编代码,则阅读它可能会提供有用的见解。
希望这有帮助!