0

我用 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()  

任何想法这里发生了什么以及我如何纠正它?

4

2 回答 2

2

问题是某些 Windows 库缺少符号;这可能使其在 32 位运行中错误解析堆栈。打开工具\选项>调试>本机:'加载DLL导出'。加载 ntdll.dll 的符号可能也很有用(在“模块”窗口中右键单击它)。在那之后,引发异常的帧有时仍然丢失,但至少你看到了调用堆栈。

于 2012-06-08T16:07:02.487 回答
0

我用默认的“Win32 Debug”尝试了你的代码,我得到了一个有效的调用堆栈。我正在使用 Windows SDK 7.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.
于 2012-05-15T22:15:49.357 回答