3

我有一个简单的代码:

#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.

这就是我在输出中看到的。只有一个例外。看起来异常以某种方式处理,然后在其他地方抛出。

4

1 回答 1

0

通常的嫌疑人:.ncb文件.pdb或其他任何内容已损坏。尝试擦除所有本地文件(解决方案.suo名称、解决方案.ncb名称、项目名称.anything.user以及中间和输出目录中的所有内容)并检查它是否有帮助。

于 2012-10-03T18:14:31.523 回答