Сбой программы с 0xC000000D и без исключений - как мне его отладить? - PullRequest
5 голосов
/ 22 ноября 2010

У меня есть приложение Visual C ++ 9 Win32, которое использует стороннюю библиотеку. При вызове функции из этой библиотеки с определенным набором параметров происходит сбой программы с «кодом исключения 0xC000000D».

Я попытался подключить отладчик Visual Studio - не выдается никаких исключений (ни C ++, ни структурированные нарушения доступа), и terminate() также не вызывается. Тем не менее программа просто тихо заканчивается.

Как получается, что программа просто ненормально завершается, но без остановки в отладчике? Как я могу локализовать проблему?

Ответы [ 3 ]

5 голосов
/ 22 ноября 2010

Это STATUS_INVALID_PARAMETER, используйте WinDbg, чтобы отследить, кто его бросил (например, присоедините WinDbg, sxe eh, затем g.

2 голосов
/ 25 ноября 2010

Другие ответы и комментарии на вопрос очень помогли.Вот что я сделал.

Я заметил, что если я запускаю программу под отладчиком Visual Studio, она просто молча завершается, но если я запускаю ее без отладчика, она вылетает с окном сообщения (обычное окно сообщения Windows, в котором говорится, что я потерял)мои несохраненные данные, и все ооочень извините).

Итак, я запустил программу без отладчика, разрешил ее сбой, а затем - пока окно с сообщением было еще там - подключил отладчик и нажал «Break».Вот стек вызовов:

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
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//SomeThirdPartyLibraryFunctionAddress
//OurCodeInvokingThirdPartyLibraryCode

, поэтому очевидно, что это какая-то проблема внутри сторонней библиотеки.Согласно MSDN, UnhandledExceptionFilter() вызывается в фатальных ситуациях, и очевидно, что вызов выполняется из-за некоторой проблемы в коде библиотеки.Поэтому сначала мы попытаемся решить проблему с поставщиком библиотеки.

1 голос
/ 22 ноября 2010

Если у вас нет исходной и отладочной информации для сторонней библиотеки, вы не сможете войти в нее с помощью отладчика. На мой взгляд, ваш выбор:

  • Соберите простой тестовый пример, иллюстрирующий сбой, и отправьте его разработчику библиотеки
  • Оберните эту библиотечную функцию в ваш собственный код, который проверяет недопустимые параметры и генерирует исключение / возвращает код ошибки, когда они передаются вашим собственным приложением
  • Переписать части библиотеки, которые не работают или используют альтернативу

Очень сложно исправить код, который предоставляется только как объект

Редактировать Вы также можете выйти более изящно, используя __try __finally вокруг основного цикла сообщений, что-то вроде

int CMyApp::Run() 
{
    __try
    {
        int i = CWinApp::Run();
        m_Exitok = MAGIC_EXIT_NO;
        return i;
    }
    __finally
    {
        if (m_Exitok != MAGIC_EXIT_NO)
            FaultHandler();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...