给定一个带有UnhandledExceptionFilter的调用堆栈,崩溃我的应用程序的异常是什么?

时间:2011-04-07 14:38:31

标签: c++ visual-studio debugging visual-c++ crash-dumps

我正在测试我的应用程序,它崩溃了。我没有调试它,所以Windows错误报告开始了(我在没有安装VS的Windows XP虚拟机上进行测试,所以我认为这就是JIT调试器没有出现的原因)。我启动了Visual Studio 2010并远程连接到违规进程。这是我从崩溃的线程中得到的调用堆栈:

ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwWaitForMultipleObjects@20()  + 0xc bytes   
kernel32.dll!_WaitForMultipleObjectsEx@20()  - 0x48 bytes   
kernel32.dll!_WaitForMultipleObjects@16()  + 0x18 bytes 
faultrep.dll!StartDWException()  + 0x5df bytes  
faultrep.dll!ReportFault()  + 0x533 bytes   
kernel32.dll!_UnhandledExceptionFilter@4()  + 0x55c bytes   
kernel32.dll!_BaseThreadStart@8()  + 0x2f45e bytes  
kernel32.dll!__except_handler3()  + 0x61 bytes  
ntdll.dll!ExecuteHandler2@20()  + 0x26 bytes    
ntdll.dll!ExecuteHandler@20()  + 0x24 bytes 
ntdll.dll!_KiUserExceptionDispatcher@8()  + 0xe bytes   
myDLL.dll!std::basic_ostream<char,std::char_traits<char> >::_Sentry_base::_Sentry_base(std::basic_ostream<char,std::char_traits<char> > & _Ostr)  Line 93 + 0x2a bytes  C++
myDLL.dll!std::basic_ostream<char,std::char_traits<char> >::sentry::sentry(std::basic_ostream<char,std::char_traits<char> > & _Ostr)  Line 114 + 0x4e bytes C++
myDLL.dll!std::basic_ostream<char,std::char_traits<char> >::write(const char * _Str, __int64 _Count)  Line 553 + 0xc bytes  C++
//... more stuff from my app

这是导致它的代码:

class _Sentry_base
    {   // stores thread lock and reference to output stream
public:
    __CLR_OR_THIS_CALL _Sentry_base(_Myt& _Ostr)
        : _Myostr(_Ostr)
        {   // lock the stream buffer, if there
        if (_Myostr.rdbuf() != 0)
            // ***VC++ says this next line was the return address***
            _Myostr.rdbuf()->_Lock();
        }

所以我想要的是找出这次崩溃发生的原因,如果已经太晚了 - 例如,如果它是一个访问冲突。我认为这是可能的,因为异常上下文仍在堆栈中,但我不知道如何实现它。

在WinDbg中这可能会更容易,但我担心如果我停止调试会话,该过程可能会死亡。这是一个非常罕见的错误,不容易重现。

2 个答案:

答案 0 :(得分:1)

如果您已经连接了VS,我会首先保存转储文件(Debug - &gt; Save Dump As)。那么也许你可以在WinDbg中打开这个转储文件并尝试在内存中查找异常上下文。例如,请参阅http://blogs.msdn.com/b/slavao/archive/2005/01/30/363428.aspx,但它或多或少是这样的(取自高级Windows调试一书):

s -d 0 L10000000 / 4 001003f (搜索上下文签名 - 0001003f - 在内存中)

然后,如果找到的东西改变了当前的上下文:

.cxr FOUND_ADDRESS

然后你应该能够看到带有 k 和相关命令的callstack。

答案 1 :(得分:0)

如果你从WinDbg附加到进程,你可以使用一堆命令(.lastevent,.excr,!cppexr)来弄清楚应用程序崩溃的原因。在Visual Studio中,您应该在输出窗口中看到异常,或者在即时窗口中尝试相同的命令。