1

Windows 7 64 位、Visual Studio 2010、控制台 C++ 应用程序、Win32 调试配置:

#include “stdafx.h”

int _tmain(int argc, _TCHAR* argv[])
{
    字符* p = NULL;
    *p = 1;
    返回0;
}

开始调试。显然,我收到此错误消息:

test.exe 中 0x77d915de 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。

我选择 Debug 并看到以下堆栈:

ntdll.dll!77d915de()    
[下面的帧可能不正确和/或丢失,没有为 ntdll.dll 加载符号]
ntdll.dll!77d915de()    
ntdll.dll!77d8014e()    
msvcr100d.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 504 + 0xc bytes C++
>ffffffff()

调试器 __finally在 dbgheap.c 中在线中断。堆栈已损坏,堆栈*p = 1中缺少行。输出窗口:

'test.exe':已加载 'C:\tmp\test\Debug\test.exe',已加载符号。
“test.exe”:已加载“C:\Windows\SysWOW64\ntdll.dll”,找不到或打开 PDB 文件
“test.exe”:已加载“C:\Windows\SysWOW64\kernel32.dll”,找不到或打开 PDB 文件
“test.exe”:已加载“C:\Windows\SysWOW64\KernelBase.dll”,找不到或打开 PDB 文件
“test.exe”:已加载“C:\Windows\SysWOW64\msvcr100d.dll”,已加载符号。
test.exe 中 0x010f13a8 处的第一次机会异常:0xC0000005:访问冲突写入位置 0x00000000。
test.exe 中 0x77d915de 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。

现在,如果我在 x64 Debug 配置中运行相同的程序,一切正常 - 调试器会中断*p = 1。如何正确调试 Win32 程序?

4

1 回答 1

3

Debug->Exceptions->win32 Exception->c0000005 在“Thrown”列或“Thrown”列中勾选整个 Win32 异常 http://msdn.microsoft.com/en-us/library/038tzxdw(v= vs.100).aspx

*p = 1; 
00041375 mov eax,dword ptr [p]
00041378 mov byte ptr [eax],1

test2.exe 中 0x00041378 处的第一次机会异常:0xC0000005:访问冲突写入位置 0x00000000

于 2012-12-13T13:31:23.480 回答