У меня проблема с тем, что во время вызова сторонней библиотечной процедуры мой процесс завершается. Я совершенно не могу уловить это в моем отладчике. Это может быть связано с этим вопросом: Как я могу отладить процесс win32, который неожиданно завершается молча? .
Когда я перехожу через вызов в эту библиотеку, отлаживаемый процесс просто завершается. Если бы это завершение было вызвано необработанным исключением или нарушением доступа к памяти, отладчик бы его поймал. Поэтому я думаю, что процесс как-то нормально завершается.
Что я пробовал:
- Установка точек останова на
ExitThread
и ExitProcess
- Установка обработчиков для необработанных исключений и недопустимых параметров (
set_terminate
и _set_invalid_parameter_handler
)
- Изменение
_set_abort_behavior
и _set_error_mode
.
- Указание отладчику остановить выполнение для всех сгенерированных исключений.
Но безрезультатно, ни один из обработчиков не вызывается, и ни одна из точек останова не срабатывает.
Что я наблюдал:
Когда процесс падает, я вижу две вещи в окне вывода отладки:
Не связано (см. Обновление ниже) Я вижу EEFileLoadException
брошенным. Быстрый гугл этого исключения не дает мне четкого ответа на вопрос, что означает это исключение.
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: EEFileLoadException at memory location 0x0030b5ac..
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: Microsoft C++ exception: [rethrow] at memory location 0x00000000..
First-chance exception at 0x7656b9bc (KernelBase.dll) in Program.exe: 0xE0434352: 0xe0434352.
При завершении все потоки возвращают один и тот же код ошибки (STATUS_INVALID_CRUNTIME_PARAMETER).
Насколько я могу судить, этот код ошибки означает, что одна из функций времени выполнения c получила недопустимый параметр, и приложение закрыто из соображений безопасности.
The thread 'Win32 Thread' (0x12c0) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0xe04) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x53c) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x116c) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x16e0) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x1420) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x13c4) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x40c) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0xc78) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0xd88) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x16c8) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0xcb8) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x584) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x1164) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x1550) has exited with code -1073740777 (0xc0000417).
The thread 'Win32 Thread' (0x474) has exited with code -1073740777 (0xc0000417).
The program '[5140] Program.exe: Native' has exited with code -1073740777 (0xc0000417).
То, что я действительно хочу знать, это то, что вызывает это, и по желанию; как я могу поймать это в отладчике?
Обновление
Что касается EEFileLoadException
, он на самом деле генерируется до того, как программа выполнит вызов, который вызывает его завершение, поэтому он не связан с завершением процесса.
Обновление
Я только что прочитал, что set_terminate
не работает в отладчике, так что об этом не может быть и речи. И, как отмечено в моем комментарии, обработчики управляются для каждого потока, поэтому у меня нет доступа к соответствующему обработчику.
Кроме того, программа, скорее всего, аварийно завершает работу в рабочем потоке, к которому у меня нет доступа, поэтому вообще трудно установить какие-либо точки останова / обработчики.
Есть ли лучший способ выяснить, что идет не так?