Я тестировал свое приложение, и оно зависло. Я не отлаживал его, поэтому появилось сообщение об ошибках Windows (я тестировал на виртуальной машине с Windows XP, на которой не установлена VS, поэтому я думаю, что именно поэтому 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 это будет проще, но я боюсь, что если я остановлю сеанс отладки, процесс может прекратиться. Это довольно редкая ошибка, которую трудно воспроизвести.