Windows 如何';子指令是否可能导致无效指针读取?
我有一个带有以下代码的崩溃转储:Windows 如何';子指令是否可能导致无效指针读取?,windows,assembly,x86-64,crash-dumps,Windows,Assembly,X86 64,Crash Dumps,我有一个带有以下代码的崩溃转储: mov r11,rsp push rdi sub rsp,0A0h mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh 这是一个函数的序曲。所以,!使用指令sub分析-v表示指针无效\u读取。 AMD指令集指出,若参数不是内存指针,则sub指令不能产生任何异常 另外,READ\u ADDRESS是ffffffffffff,但在寄存器窗口中我可以看到rsp是12b3e0。这是64位操作系统中的32位
mov r11,rsp
push rdi
sub rsp,0A0h
mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
这是一个函数的序曲。所以,!使用指令sub
分析-v
表示指针无效\u读取
。
AMD指令集指出,若参数不是内存指针,则sub
指令不能产生任何异常
另外,READ\u ADDRESS
是ffffffffffff
,但在寄存器窗口中我可以看到rsp
是12b3e0
。这是64位操作系统中的32位应用程序
我想知道这个错误的可能原因以及如何修复它
UPD:
方法是Microsoft Visual Studio 9.0\VC\include\xtree中的std.\u Tree.insert(const value\u type&\u 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位寄存器,这并不奇怪。发生了其他事情。在这整组操作码中没有内存读取操作。您只有两次写入(推送和mov)。您的对齐很好,将立即qword值-2放置在堆栈的一个区域中,应该可以 操作系统和操作码的严格程度与此有关。我一直使用64位寄存器。这就像使用32位时,一切都是16位
去别的地方看看。DEP?或者来自调试器的虚假信息。你确定是
子失败了吗?RIP不喜欢在失败的指令之后指向该指令吗…?如何可能您正在调试32位应用程序,并且显示的代码是64位的?最佳做法是使用32位调试器调试32位进程/转储。