我正在测试我的应用程序,它崩溃了。我没有调试它,所以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中这可能会更容易,但我担心如果我停止调试会话,该过程可能会死亡。这是一个非常罕见的错误,不容易重现。
答案 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中,您应该在输出窗口中看到异常,或者在即时窗口中尝试相同的命令。