Как я могу определить, почему мой процесс завершается
У меня проблема, когда во время обращения к сторонней библиотечной программе мой процесс завершается. Я полностью не могу уловить это в своем отладчике. Это может быть связано с этим вопросом: Как я могу отладить процесс win32, который неожиданно завершает молчание?.
Когда я перехожу через вызов в эту библиотеку, процесс отладки просто завершается. Если это прекращение было связано с необработанным исключением или нарушением доступа к памяти, отладчик поймал бы его. Поэтому я думаю, что процесс каким-то образом заканчивается нормально.
Что я пробовал:
- Установка точек останова на
ExitThread
и ExitProcess
- Установка обработчиков для необработанных исключений и недопустимых параметров (
set_terminate
и _set_invalid_parameter_handler
)
- Изменение
_set_abort_behavior
и _set_error_mode
.
- Поручить отладчику прекратить выполнение всех исключенных исключений.
Но безрезультатно ни один из обработчиков не вызван, и ни одна точка останова не запускается.
То, что я наблюдал:
Когда процесс выходит из строя, я вижу две вещи в окне вывода отладки:
-
Не связано (см. обновление ниже) Я вижу EEFileLoadException
. Быстрый google этого исключения не дает мне ясного ответа на whar это исключение означает.
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
не работает в отладчике, так что не может быть и речи. И, как отмечено в моем комментарии, обработчики управляются по потоку, поэтому у меня нет доступа к соответствующему обработчику.
Кроме того, программа, скорее всего, сбой в рабочем потоке, к которому у меня нет доступа, поэтому сложно установить любые точки останова/обработчики.
Есть ли лучший способ выяснить, что не так?
Ответы
Ответ 1
Настройте procdump для создания дампа вашего процесса во время завершения процесса. Не уверен, что VS2010 может открыть файлы дампа, но windbg может. Затем выгрузите все стеки потоков, и вы увидите тот, который вызывает прекращение. Затем вы сможете проверить стек, чтобы найти аргумент, вызывающий оскорбление.
Если ваше приложение является foo.exe, запустите procdump из командной строки, например:
procdump -ma -t -w foo.exe
-ma указывает полный дамп памяти
-t указывает дамп записи при завершении процесса
-w указывает на ожидание запуска процесса, если он еще не запущен
Затем запустите приложение вне любого отладчика. После его завершения вы должны увидеть вывод procdump, указывающий, что процесс завершился и что он пишет файл дампа.
Здесь ссылка на procdump:
http://technet.microsoft.com/en-us/sysinternals/dd996900
Ответ 2
Запустите приложение nuder debugger (или подключитесь к запущенному процессу), нажмите Ctrl+Alt+E
и установите флажки, чтобы отладка прекратила выполнение исключения.
Каждый раз, когда происходит исключение, отладчик прерывается. Вы сможете проверить состояния потоков/стек вызовов, чтобы определить проблему.
Типичными причинами неожиданно прекращения приложения являются:
- что-то действительно отправляет сообщение
WM_QUIT
, и это инструктирует приложение закрыть
- происходит исключение, и оно не обрабатывается (например, в фоновом потоке); исключение обходит стек вызовов до ОС и не знает, что делать со всем этим, и просто убивает процесс.
Как исключение EEFileLoadException
имеет место, и вы не знаете, что это такое, вы, возможно, захотите, чтобы первое, что нужно понять, если оно обработано или нет, если оно на самом деле является фатальным для вашего приложения.
Ответ 3
Я столкнулся с той же проблемой раньше. Я просто удалил obj файл в проекте С#. И снова перестроим, и проект работал. Надеюсь, это решит вашу проблему.