DUMP в необработанном исключении C ++ - PullRequest
3 голосов
/ 02 июня 2010

Как в MSVC, как я могу сделать любое необработанное исключение C ++ (например, std :: runtime_error), аварийно завершающее работу моей скомпилированной версии, чтобы она генерировала дамп с полным стеком из местоположения выброса исключения?

Я установил NTSD в реестре AeDebug и могу генерировать хорошие дампы для таких вещей, как нарушение доступа к памяти, поэтому, я полагаю, дело здесь в правильном сбое программы.

Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 10 июня 2010

Я наконец сломал это.

  1. Используйте функцию set_terminate(), чтобы зарегистрировать обработчик для каждого потока
  2. В вашей главной функции () исключение возможности для внешних DLL (событие Windows ') успешно вызывать SetUnhandledExceptionFilter(). Отличная статья о том, как это сделать, здесь: http://www.debuginfo.com/articles/debugfilters.html#overwrite.
  3. Что касается самой ручки, она довольно проста:
void Terminate()
{
  OutputDebugStringA("Terminate\r\n");
  RaiseException(0xE0000010, EXCEPTION_NONCONTINUABLE, 0, 0);
}

Вызов RaiseException(), как в приведенном выше примере, достаточен, чтобы вызвать сбой процесса и произвести желаемый дамп.

Как вы знаете, у меня была проблема:

  1. IPHelper Windows API динамически загружает другую Windows DLL
  2. Эта DLL-библиотека использует собственную версию Windows среды выполнения C (MSVCRT вместо MSVCRT90)
  3. Новая среда выполнения C ++ вызывает SetUnhandledExceptionFilter() при запуске, чтобы перехватить исключения C ++. Так как последний фильтр для исключений C ++ - это тот, кто вызывает вызов дескриптора, установленного set_terminate (), мой дескриптор не вызывался.
1 голос
/ 02 июня 2010

SetUnhandledExceptionFilter и DebugBreak, вероятно, должны делать эту работу.

Редактировать: упс, перечитывание, вы хотите иметь дело с необработанными исключениями C ++.Это было бы немного сложнее сделать хорошо - к тому времени, когда вы (обычно) узнаете об исключении C ++, он уже размотал стек обратно до уровня обработчика.У вас нет никакого реального способа узнать, что было сгенерировано исключение до тех пор, пока не будет вызван catch, но к тому времени стек был размотан.

0 голосов
/ 02 июня 2010

Изучите использование отладчика Windows.
Windbg - обёртывает KD и NTSD приличным интерфейсом.
Также проверьте ADPlus, который поставляется с отладчиком Windows.

Здесь - хорошее место, чтобы начать изучать, как его использовать.

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