我有一个简单的代码:
#include "stdafx.h"
#include <iostream>
void foo()
{
int* p = 0;
*p = 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
std::cout << "123";
foo();
std::cout << "456";
return 0;
}
默认调试 Visual Studio 设置。调试 -> 异常 -> 全部重置。
在调试配置中运行此代码后的结果 - 我在 exc.exe 中的 0x77d315de (ntdll.dll) 处遇到异常未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。VS 打开文件ostream,指针停留在这里:
_Ostr.setstate(_State);
return (_Ostr);
} <--
堆栈跟踪:
ntdll.dll!_ZwRaiseException@12() + 0x12 bytes
ntdll.dll!_ZwRaiseException@12() + 0x12 bytes
exc.exe!std::operator<<<std::char_traits<char> >(std::basic_ostream<char,std::char_traits<char> > & _Ostr={...}, const char * _Val=0x00000000) Line 808 + 0xf bytes C++
> exc.exe!wmain(int argc=0x00000001, wchar_t * * argv=0x00164810) Line 14 C++
exc.exe!__tmainCRTStartup() Line 552 + 0x19 bytes C
exc.exe!wmainCRTStartup() Line 371 C
kernel32.dll!@BaseThreadInitThunk@12() + 0x12 bytes
ntdll.dll!___RtlUserThreadStart@8() + 0x27 bytes
ntdll.dll!__RtlUserThreadStart@8() + 0x1b bytes
如果我在 Debug -> Win32 Exceptions -> C0000005 Visual Studio 中设置复选框“Thrown”,则在正确的位置停止。
我的同事拥有相同的 Visual Studio、Windows 7 x64 和相同的硬件。但是他的 VS 停在正确的地方,没有改变异常设置。
我的 Visual Studio 设置有什么问题?
最大的问题 - .net 异常的行为也不典型。此时在调试模式下,VS 几乎忽略了所有异常。看起来我有全局异常过滤器并且所有异常都得到了处理。程序可以在发布模式下运行并显示对话框 Catel mvvm 工具包向我发送关于未注册模型和文件系统异常的异常。
任何想法,我如何在不设置“抛出”复选框的情况下修复它。
[编辑]
好吧,我发现了一些奇怪的东西。更改 Debug -> Exceptions 后,我在异常处停止。但是,如果我按继续,我将转到 ostream 文件。看起来 VS 调试器默认按“继续”。
[编辑]
First-chance exception at 0x012514cf in exc.exe: 0xC0000005: Access violation writing location 0x00000000.
Unhandled exception at 0x773515de (ntdll.dll) in exc.exe: 0xC0000005: Access violation writing location 0x00000000.
这就是我在输出中看到的。只有一个例外。看起来异常以某种方式处理,然后在其他地方抛出。