Visual studio显示SEH异常的错误位置

Visual studio show wrong location for SEH Exception

本文关键字:错误 位置 异常 SEH studio 显示 Visual      更新时间:2023-10-16

我有一个简单的代码:

#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设置。调试->异常->全部重置。

在调试配置中运行此代码后的结果-i在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    

如果我在调试->Win32异常->C0000005中设置复选框"抛出",Visual Studio将停止在正确的位置。

我的同事有相同的Visual Studio,Windows 7 x64和相同的硬件。但他的VS停在了正确的位置,没有改变异常设置。

我的Visual Studio设置有什么问题?

最大的问题-有.net异常的行为也不典型。此时,在调试模式下,VS几乎忽略所有异常。看起来我有全局异常过滤器,所有异常都得到了处理。程序可以在发布模式下运行并显示对话框Catel mvvm工具包向我发送关于未注册模型和文件系统异常的异常。

任何想法,我如何在不设置"抛出"复选框的情况下修复它。

[EDIT]

好的,我发现了一些奇怪的东西。在更改调试->异常之后,我在出现异常的行处停止。但如果我按Continue,我将转到ostream文件。看起来VS调试器在默认情况下按"继续"。

[EDIT]

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.

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

常见的可疑:.ncb文件或.pdb或其他文件已损坏。尝试擦除所有本地文件(solutionname.suosolutionname.ncbprojectname.anything.user以及中间目录和输出目录中的所有文件),并检查它是否有帮助。