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

У меня проблема, когда во время обращения к сторонней библиотечной программе мой процесс завершается. Я полностью не могу уловить это в своем отладчике. Это может быть связано с этим вопросом: Как я могу отладить процесс 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 файл в проекте С#. И снова перестроим, и проект работал. Надеюсь, это решит вашу проблему.