在Visual Studio上的内存地址处观察一个类对象

问题描述 投票:6回答:4

我正在调试用户转储文件,并且在堆栈跟踪的顶部有这个类成员函数

  • 堆栈跟踪是这样的 -

msvcr80.dll!__ invalid_parameter_noinfo()+ 0xc bytes - 1st FRAME msvcr80.dll!__ invalid_parameter_noinfo()+ 0xc bytes - 2nd FRAME myDLL!myClass :: myClassMemFunc(int val = 90) - 第3帧

现在,当我跳到第3帧时 - “this”指针值无效(从ECX寄存器中检索“this”值 - 但ECX寄存器值在上面的堆栈跟踪的前两个函数中发生了变化 - ) - 所以我无法看到我的类对象的实际成员变量 -

但我知道我的类对象的地址 - 这是0x0012ECE0

当我试图用 - (myClass *)(0x0012ECE0)观察内存地址时

我得到一个CXX0019:错误:输入错误

even(myClass)(0x0012ECE0)生成相同的错误。

我在这做错什么吗? - 什么是检索类对象值的正确方法?

windows visual-studio debugging
4个回答
6
投票

只是一个盲目的猜测:尝试(myDLL!myClass *)(0x0012ECE0)

另一个问题,你怎么能确定它是你对象的地址?

作为旁注,试试windbg - 在内存/堆栈周围查找对象会更简单。


1
投票

这可能对您现在拥有的用户转储没有帮助,但是对于将来的用户转储,请将优化设置“忽略帧指针”设置为否。这有助于“此”指针和本地变量。


1
投票

这可能是由于嵌套类

示例:class A {class B {int i; }; };

像(B *)(0x12345678)的演员表会失败但是(A :: B *)(0x12345678)会成功


0
投票

我通过添加dll上下文解决了这个问题:

{,,myDLL.dll}(myClass*)(0x028073a8)

Documentation here

© www.soinside.com 2019 - 2024. All rights reserved.