如何通过Windbg脚本获取C++属性的地址

3

如何使用脚本文件在Windbg中获取实例属性的地址?

一个属性意外地发生了变化,无法从Visual Studio 2010调试器中看到该值是如何改变的,并且在内存地址上设置断点后不能取消断点,因为类的析构函数被调用后无法取消。出现错误的特定对象实例也不固定。

这是一个用户空间应用程序。


C++中没有适当的属性。C++/CX确实有属性,但显然这不是你所说的,因为你的“属性”是可变的,而C++/CX的属性是不可变的。请澄清你所指的是什么。也许你是指成员字段? - undefined
所谓属性,我指的是成员字段。从谷歌搜索结果来看,属性在我上面的用法中有不同的含义。 - undefined
1个回答

1
如果我理解正确,您需要在C ++类实例的地址+偏移量上设置一个“中断访问(Break on Access)”,只要涉及的类没有被大量实例化,这是可能的。
1)在属性初始化后,在构造函数中创建普通的bp中断。
bp Foo:Foo+<xxx>

你必须找出属性的偏移量,请查看这里

你必须找出此时保持this指针的寄存器。

2)然后修改1)中断,设置一个额外的ba(访问时中断)。

断点地址必须计算为this + 偏移量。重要的是要指定ID,因为我们必须在析构函数中删除中断。

应该是这样的:

bp <module>!Foo:Foo+<xxx> “ba[@eax] w4 @eax+4;gc ”
From hlp:
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

3) 在析构函数中设置代码断点(bp),并删除上面的ba。 您必须再次找到一个直接或间接保存this指针的寄存器。 类似于:

bc[poi(@ebp-0x08)]

我已经这样做了,只要程序实例化的太多不会用完断点,它就能正常工作。
注意:语法可能不是100%正确,因为距离上次使用已经有一段时间了。

你理解问题的正确。在使用Windbg时,是否存在一些我应该了解的C++到CPU的映射关系?比如,我从哪里获取this指针的值? - undefined
1
this指针的值是从堆管理器返回的,"!heap -a"将列出所有条目,但不能称为C++的映射。 - undefined
"!heap -a" 抱怨 wow64!_TEB64(我没有使用正确的符号),我有一台 Windows 7 64 位机器,并安装了 64 位和 32 位的符号。该计算机无法直接访问互联网,因此无法在 Windbg 中使用符号服务器。我应该使用哪个符号? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接