【发布时间】:2013-12-20 08:40:36
【问题描述】:
我有一个包含此代码的故障转储:
mov r11,rsp
push rdi
sub rsp,0A0h
mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
这是一个功能的序幕。所以,!analyze -v 说 INVALID_POINTER_READ 和指令 sub。
AMD 指令集表示,如果参数不是内存指针,sub 指令不会产生任何异常。
另外,READ_ADDRESS 是 ffffffffffffffff,但在寄存器窗口中我可以看到 rsp 是 12b3e0。这是 64 位操作系统中的 32 位应用程序。
我想知道这个错误的可能原因以及如何解决它。
更新:
Microsoft Visual Studio 9.0\VC\include\xtree 中的方法是 std._Tree.insert(const value_type& _Val)。
编译器是来自 Visual Studio 2008 安装的 cl.exe,32 位,版本 15.00.30729.01。
命令行:
/FD /EHsc /MD /GS- /Zc:wchar_t- /Yu"stdafx.h"/W3 /WX /nologo /c /Zi /TP /wd4250 /FI -Zm200 -MP -w34100 -w34189
链接器来自同一来源,版本 9.00.30729.01。
UPD:对于那些对使用 64 位调试器调试 32 位应用程序持怀疑态度的人,我运行了一个 32 位版本的调试器并得到了相同的结果。所以,我仍然认为它是sub 指令。
UPD:澄清一下:应用程序是为32位平台构建的。但处理器和操作系统是64位。因此,在转储中我们可以看到具有 32 位值的 64 位寄存器,这并不奇怪。
【问题讨论】:
-
DEP?或者来自调试器的虚假信息。
-
你确定是
sub失败了吗? RIP 不喜欢在失败的指令之后指向指令吗...? -
你怎么可能在调试一个 32 位的应用程序,而你显示的代码是 64 位的?
-
最佳实践是使用 32 位调试器来调试 32 位进程/转储。
标签: windows assembly x86-64 crash-dumps