2012-02-18 3 views
0

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

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

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

+0

Если вы используете программирование в Windows с помощью Delphi, «безумное исключение» - отличный инструмент, который делает именно это: http://madshi.net/ – paulsm4

+0

Посмотрите здесь http://stackoverflow.com/questions/ 691719/c-display-stack-trace-on-exception, возможно, это то, что вы ищете. – Mithrandir

ответ

2

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

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

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

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

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

Смежные вопросы