Отчет о сбоях в C для Linux - PullRequest
       58

Отчет о сбоях в C для Linux

4 голосов
/ 08 сентября 2008

После этого вопроса:
Хорошая библиотека отчетов о сбоях в c #

Есть ли какая-либо библиотека, подобная CrashRpt.dll, которая делает то же самое в Linux? То есть создать отчет об ошибке, включая дамп ядра и любую необходимую среду, и уведомить об этом разработчика?

Редактировать: Кажется, что это дубликат этот вопрос

Ответы [ 7 ]

3 голосов
/ 08 сентября 2008
2 голосов
/ 08 сентября 2008

Скомпилируйте ваш код с помощью символов отладки, введите unlimit coredumpsize в вашей оболочке, и вы получите coredump в той же папке, что и бинарный файл. Используйте gdb / ddd - сначала откройте программу, а затем откройте дамп ядра. Вы можете проверить это для получения дополнительной информации.

1 голос
/ 08 сентября 2008

@ Йонут
Это обрабатывает создание дампа ядра, но не обрабатывает уведомление разработчика о сбоях других пользователей.

0 голосов
/ 12 сентября 2008

Натан, я не настаивал на том, что ты ошибался; Я просто говорил, что в моем (ограниченном) опыте работы с Linux база сегментов всегда равна нулю. Может быть, это хороший вопрос для меня ...

0 голосов
/ 11 сентября 2008

@ Martin

Я делаю архитектурную проверку для x86, так что я очень знаком с архитектурой, которую обеспечивает процессор, но очень плохо знаком с тем, как он используется. На этом я и основал свой комментарий. Если можно рассчитывать, что CR2 даст правильный ответ, то я исправлюсь.

0 голосов
/ 11 сентября 2008

Натан, при каких обстоятельствах в сегменте база ненулевая? Я никогда не видел, чтобы это происходило за 5 лет разработки приложений для Linux.

Спасибо.

0 голосов
/ 10 сентября 2008

Примечание: в аварийном сбое x86 есть два интересных регистра.

Первый, EIP , указывает адрес кода, по которому произошло исключение. В ответе RichQ он использует addr2line, чтобы показать исходную строку, соответствующую адресу сбоя. Но EIP может быть недействительным; если вы вызываете нулевой указатель на функцию, это может быть 0x00000000, а если вы повредите свой стек вызовов, в результате возврата любое случайное значение может оказаться в EIP.

Второй, CR2 , указывает адрес данных, вызвавший ошибку сегментации. В примере RichQ он настраивает i как нулевой указатель, а затем обращается к нему. В этом случае CR2 будет 0x00000000. Но если вы измените:

int j = *i

до:

int j = i[2];

Затем вы пытаетесь получить доступ к адресу 0x00000008, и это то, что будет найдено в CR2.

...