Как я могу отладить процесс win32, который неожиданно завершается без вывода сообщений? - PullRequest
7 голосов
/ 18 декабря 2008

У меня есть приложение для Windows, написанное на C ++, которое иногда испаряется. Я использую слово «испариться», потому что ничего не осталось позади: никаких сообщений «извините» из Windows, никаких аварийных дампов с объекта доктора Ватсона ...

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

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

Ответы [ 11 ]

5 голосов
/ 18 декабря 2008

Вы можете попробовать использовать утилиту adplus в пакете средств отладки Windows .

adplus -crash -p yourprocessid

Инструмент автоматического дампа предоставляет мини-дампы для исключений и полный дамп в случае сбоя приложения.

4 голосов
/ 18 декабря 2008

Если вы используете Visual Studio 2003 или более позднюю версию, вам следует включить функцию обработчика «Исключение первого шанса» отладчиков, включив ВСЕ параметры «Отрыв исключения отладки», найденные в меню «Отладка» | Диалог исключений. Включите КАЖДУЮ опцию перед началом отладочной сборки процесса в отладчике.

По умолчанию большинство из этих обработчиков исключений First Chance в отладчике отключены, поэтому, если Windows или ваш код выдает исключение, отладчик ожидает, что ваше приложение его обработает.

Система исключения первого шанса позволяет отладчикам перехватывать КАЖДЫЕ возможные исключения, создаваемые процессом и / или системой.

http://support.microsoft.com/kb/105675

3 голосов
/ 18 декабря 2008

Все остальные идеи хороши.

Но также звучит так, будто приложение вызывает abort () или terminate ().

Если вы запускаете его в отладчике, установите точку останова на обоих этих методах и exit () просто для хорошей меры.

Вот список ситуаций, из-за которых завершается вызовом из-за исключительных ситуаций , происходящих неправильно.

Смотрите также: Почему деструктор не вызывается при исключении?

Это показывает, что приложение завершит работу (), если исключения не будут перехвачены. Поэтому вставьте блок catch в main (), который сообщает об ошибке (в файл журнала), а затем перезапустите.

int main()
{
    try
    {
        // Do your code here.
    }
    catch(...)
    {
        // Log Error;
        throw;  // re-throw the error for the de-bugger.
    }
}
2 голосов
/ 18 декабря 2008

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

Это возможно в вашем приложении?

2 голосов
/ 18 декабря 2008

Ну, проблема в том, что вы получаете нарушение прав доступа. Вы можете присоединиться к WinDBG и включить все фильтры исключений. Это может все еще не помочь - я предполагаю, что вы получаете повреждение памяти, которое не вызывает исключение.

Возможно, вы захотите взглянуть на , включающую полную проверку кучи страниц

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

1 голос
/ 18 декабря 2008

Это может быть вызов _exit () или некоторый эквивалент Windows. Попробуйте установить точку останова на _exit ...

1 голос
/ 18 декабря 2008

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

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

1 голос
/ 18 декабря 2008

Вы можете проверить журналы Windows в Просмотр событий в Windows.

0 голосов
/ 23 октября 2017

Я потратил пару часов, пытаясь разобраться в этом в Visual Studio 2017, запустив 64-разрядное приложение в Windows 7. В итоге мне пришлось установить точку останова для функции RtlReportSilentProcessExit , которая находится в ntdll.dll файл. Visual Studio достаточно было просто найти имя базовой функции.

Тем не менее после того, как я позволил Visual Studio автоматически загружать символы для стандартной библиотеки C, он также автоматически остановился на исключительной ситуации времени выполнения, которая вызвала проблему.

0 голосов
/ 13 мая 2010

Возможные причины приходят на ум.

  • TerminateProcess ()
  • Исключение переполнения стека
  • Исключение при обработке исключения

Последнее, в частности, приводит к немедленному отказу приложения.
Переполнение стека - вы можете получить уведомление об этом, но вряд ли.

Зайдите в отладчик, измените все уведомления об исключениях на "всегда останавливаться", а не "останавливать, если не обработано", затем сделайте то, что вы делаете, чтобы вызвать сбой программы. Отладчик остановится, если вы получите исключение, и вы сможете решить, является ли это искомым исключением.

...