C++ win32 vs2010 null取消引用中的调用堆栈损坏,但在x64中没有

C++ win32 vs2010 null取消引用中的调用堆栈损坏,但在x64中没有,c++,c,visual-studio-2010,64-bit,C++,C,Visual Studio 2010,64 Bit,我使用vs2010创建了一个简单的win32控制台程序,并创建了一个空解引用: int _tmain(int argc, _TCHAR* argv[]) { if (*(int*)(NULL) == 5) { printf("foo"); } return 0; } 当我使用x64配置运行此程序时,调试器中会出现一个“未处理的异常”和有效的调用堆栈。当我切换到win32时,仍然会得到一个“未处理的异常”,但是堆栈无效。我得到以下信息: ntdll.dll

我使用vs2010创建了一个简单的win32控制台程序,并创建了一个空解引用:

int _tmain(int argc, _TCHAR* argv[])
{
    if (*(int*)(NULL) == 5) {
        printf("foo");
    }
    return 0;
}
当我使用
x64
配置运行此程序时,调试器中会出现一个“未处理的异常”和有效的调用堆栈。当我切换到win32时,仍然会得到一个“未处理的异常”,但是堆栈无效。我得到以下信息:

ntdll.dll!770a15de()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!770a15de()    
ntdll.dll!7709014e()    
>msvcr100d.dll!_heap_alloc_dbg_impl(...)
ffffffff()  

你知道这是怎么回事吗?我用默认的“Win32 Debug”尝试了你的代码,得到了一个有效的调用堆栈。我正在使用WindowsSDK7.1。您应该检查项目设置

#include <stdio.h>
#include <tchar.h>

int _tmain(int argc, _TCHAR* argv[])
{
    if (*(int*)(NULL) == 5) {
        printf("foo");
    }
    return 0;
}

test.exe!wmain(int argc, wchar_t**argv) Line 6
test.exe!__tmainCRTStartup() Line552 + 0x19 bytes
...

First-chance exception at 0x0003139e in test.exe: 0xC0000005: Access violation reading location 0x00000000.
Unhandled exception at 0x0003139e in test.exe: 0xC0000005: Access violation reading location 0x00000000.
#包括
#包括
int _tmain(int argc,_TCHAR*argv[]
{
如果(*(int*)(NULL)==5){
printf(“foo”);
}
返回0;
}
test.exe!wmain(内部argc,wchar\u t**argv)第6行
test.exe__tmainCRTStartup()行552+0x19字节
...
test.exe中0x0003139e处的首次机会异常:0xC0000005:访问冲突读取位置0x00000000。
test.exe中0x0003139e处的未处理异常:0xC0000005:访问冲突读取位置0x00000000。

问题在于某些Windows库缺少符号;这可能会使它在32位运行时误放堆栈。启用工具\选项>调试>本机:'Load DLL exports'。加载ntdll.dll的符号(在模块窗口中右键单击它)可能也很有用。在这些之后,引发异常的帧有时仍然丢失,但至少您可以看到到该点的调用堆栈。

为什么要尝试取消引用
NULL
?win32的项目设置|调试没有生成调试符号,或者您很可能缺少目标计算机上的32位调试CRT。这不是调用堆栈损坏,而是缺少调试符号,无法通过调试器使其可读。我肯定是在生成调试符号。我有点怀疑它是否缺少32位调试CRT,因为demangler认为它找到了与msvcr100d.dll匹配的文件_heap\u alloc\u dbg\u impl。堆栈上没有任何其他内容。它至少应该显示“main”。对于x86/x64和Debug/Release的所有四种组合,我得到了足够好的堆栈跟踪。能否在
\u tmain()的第一行设置断点?如果是这样的话,您是否在该点获得了良好的堆栈跟踪?