Как я могу определить, почему мой процесс заканчивается - PullRequest
10 голосов
/ 27 сентября 2011

У меня проблема с тем, что во время вызова сторонней библиотечной процедуры мой процесс завершается. Я совершенно не могу уловить это в моем отладчике. Это может быть связано с этим вопросом: Как я могу отладить процесс win32, который неожиданно завершается молча? .

Когда я перехожу через вызов в эту библиотеку, отлаживаемый процесс просто завершается. Если бы это завершение было вызвано необработанным исключением или нарушением доступа к памяти, отладчик бы его поймал. Поэтому я думаю, что процесс как-то нормально завершается.

Что я пробовал:

  • Установка точек останова на ExitThread и ExitProcess
  • Установка обработчиков для необработанных исключений и недопустимых параметров (set_terminate и _set_invalid_parameter_handler)
  • Изменение _set_abort_behavior и _set_error_mode.
  • Указание отладчику остановить выполнение для всех сгенерированных исключений.

Но безрезультатно, ни один из обработчиков не вызывается, и ни одна из точек останова не срабатывает.

Что я наблюдал: Когда процесс падает, я вижу две вещи в окне вывода отладки:

  1. Не связано (см. Обновление ниже) Я вижу 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.
    
  2. При завершении все потоки возвращают один и тот же код ошибки (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 не работает в отладчике, так что об этом не может быть и речи. И, как отмечено в моем комментарии, обработчики управляются для каждого потока, поэтому у меня нет доступа к соответствующему обработчику.

Кроме того, программа, скорее всего, аварийно завершает работу в рабочем потоке, к которому у меня нет доступа, поэтому вообще трудно установить какие-либо точки останова / обработчики.

Есть ли лучший способ выяснить, что идет не так?

Ответы [ 3 ]

2 голосов
/ 07 марта 2013

Сконфигурируйте 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

0 голосов
/ 05 марта 2013

Я сталкивался с такой же проблемой раньше.Я только что удалил файл obj в проекте C #.И восстановите снова, и это работает проект.Надеюсь, что это решит вашу проблему.

0 голосов
/ 27 сентября 2011

Запустите приложение-отладчик nuder (или присоедините его к запущенному процессу), нажмите Ctrl+Alt+E и установите флажки, чтобы отладчик останавливал выполнение за исключением вас.

Каждый раз, когда возникает исключение, отладчик ломается. Вы сможете проверить состояния потоков / стек вызовов, чтобы, возможно, выявить проблему.

Типичные причины неожиданного завершения работы приложения:

  • что-то действительно отправляет WM_QUIT сообщение, и это дает команду приложению закрыть
  • исключение имеет место, и оно не обрабатывается (особенно в фоновом потоке); исключение пересекает стек вызовов до ОС и не знает, что делать со всем этим, и просто убивает процесс

Поскольку возникает EEFileLoadException исключение, и вы не знаете, о чем оно, вы, возможно, захотите, чтобы первое, что вы поняли, было ли оно обработано или нет, если это на самом деле фатальная вещь для вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...