Какое исключение вызвало сбой моего приложения, учитывая стек вызовов с UnhandledExceptionFilter? - PullRequest
0 голосов
/ 07 апреля 2011

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

Ответы [ 2 ]

1 голос
/ 11 апреля 2011

Если вы уже подключили VS, я бы сначала сохранил файл дампа (Debug -> Save Dump As). Тогда, возможно, вы могли бы открыть этот файл дампа в WinDbg и попытаться найти контекст исключений в памяти. См., Например, http://blogs.msdn.com/b/slavao/archive/2005/01/30/363428.aspx, но это выглядит примерно так (взято из Advanced Windows Debugging book):

s -d 0 L10000000 / 4 001003f (поиск подписи контекста - 0001003f - в памяти)

тогда, если что-то найдено, измените текущий контекст:

.cxr FOUND_ADDRESS

тогда вы сможете увидеть стек вызовов с помощью k и связанных с ним команд.

0 голосов
/ 07 апреля 2011

если вы присоединяетесь к процессу из WinDbg, вы можете использовать кучу команд (.lastevent, .excr,! Cppexr), чтобы выяснить причину сбоя приложения. В Visual Studio вы должны увидеть исключение в окне вывода или попробовать те же команды в непосредственном окне.

...