Создание журнала сбоев - PullRequest
       19

Создание журнала сбоев

0 голосов
/ 18 февраля 2012

Когда я хочу найти segfault или любую другую ошибку, которая приводит к сбою программы, я всегда проверяю дамп ядра с помощью gdb.Это довольно болезненно, когда такое приложение запускается на компьютере без установленного GDB.

Итак, несколько дней назад я использовал программу (JDownloader), которая написала файл журнала сбоев, и этот файл содержал трассировку стека.Я думал, что это будет большим улучшением для моего приложения.Но я не нашел никакой информации о том, как написать файл, содержащий трассировку стека непосредственно перед сбоем.

Возможно ли это вообще?Как бы я сделал это на Linux / Windows?Я использую C / C ++.

1 Ответ

2 голосов
/ 19 февраля 2012

Я считаю, что JDownloader написан на Java. Я думаю, что язык позволяет вам получить полную трассировку стека в виде простого текста в любой точке. C ++ не может этого сделать, потому что скомпилированный исполняемый файл обычно не хранит никакой информации о коде, использованном для его генерации.

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

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

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

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

...