2011-04-07 31 views
0

我在測試我的應用程序,並墜毀。我沒有調試,所以Windows錯誤報告踢(我是其中沒有安裝VS Windows XP虛擬機上測試,所以我認爲這就是爲什麼JIT調試沒有露面)。我啓動了Visual Studio 2010並遠程連接到違規流程。這是調用堆棧,我從崩潰的線程得到:那是什麼墜毀我的應用程序之外,給出UnhandledExceptionFilter的調用堆棧?

[email protected]() 
[email protected]() + 0xc bytes 
[email protected]() - 0x48 bytes 
[email protected]() + 0x18 bytes 
faultrep.dll!StartDWException() + 0x5df bytes 
faultrep.dll!ReportFault() + 0x533 bytes 
[email protected]() + 0x55c bytes 
[email protected]() + 0x2f45e bytes 
kernel32.dll!__except_handler3() + 0x61 bytes 
[email protected]() + 0x26 bytes  
[email protected]() + 0x24 bytes 
[email protected]() + 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中比較容易,但我害怕,如果我停止調試會話,該進程可能會死。這是一個非常罕見的錯誤,不容易重現。

回答

1

如果您已連接VS我會先保存轉儲文件(調試 - >另存爲轉儲)。然後,也許你可以在WinDbg中打開這個轉儲文件,並嘗試在內存中查找異常上下文。例如見http://blogs.msdn.com/b/slavao/archive/2005/01/30/363428.aspx,但它會或多或少像這樣(從高級Windows調試書所):

小號-d 0 L10000000/4 001003f(搜索上下文簽名 - 0001003f - 在內存中)

然後如果有什麼發現改變當前情境:

胸片FOUND_ADDRESS

,那麼你應該能夠看到日調用堆棧e k及相關命令。

0

,如果你連接到從WinDbg中,你可以使用的命令串(.lastevent,.excr,!cppexr)弄清楚爲什麼應用程序崩潰的過程。在Visual Studio中,您應該在輸出窗口中看到異常,或者在即時窗口中嘗試相同的命令。

相關問題