cas*_*rad 5 windows assembly x86-64 crash-dumps
我有一个崩溃转储与此代码:
mov r11,rsp
push rdi
sub rsp,0A0h
mov qword ptr [rsp+30h],0FFFFFFFFFFFFFFFEh
Run Code Online (Sandbox Code Playgroud)
这是一个功能的序幕.所以,!analyze -v
说INVALID_POINTER_READ
与指令sub
.AMD指令集表示,sub
如果参数不是内存指针,则指令不会产生任何异常.
而且,READ_ADDRESS
是ffffffffffffffff
的,但在寄存器窗口,我可以看到rsp
的12b3e0
.这是64位操作系统中的32位应用程序.
我想知道这个错误的可能原因以及如何解决它.
UPD:
方法是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
Run Code Online (Sandbox Code Playgroud)
链接器来自同一来源,版本9.00.30729.01.
UPD:对于那些对使用64位调试器调试32位应用程序持怀疑态度的人,我运行了32位版本的调试器并得到了相同的结果.所以,我仍然认为这是sub
指令.
UPD:澄清:该应用程序是为32位平台构建的.但处理器和操作系统是64位的.因此,在转储中我们可以看到具有32位值的64位寄存器,这并不奇怪.
小智 2
还有其他事情正在发生。整个操作码集中没有内存读取操作。您只有两次写入(推送和移动)。您的对齐方式很好,并且将直接 qword 值 -2 放置在应该可以的堆栈区域中。
操作系统和操作码的位数与此无关。我一直使用 64 位寄存器。就像一切都是 16 位时使用 32 位一样。
看看别的地方。
归档时间: |
|
查看次数: |
450 次 |
最近记录: |