| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Программирование под Unix/Linux > Minidump в Linux |
| Автор: ajuvolkov 25.2.2010, 13:49 |
| Всем привет. Есть кроссплатформенное приложение, в котором нужно реализовать функцию создания отчетов при падении приложения. Т.е. фактически на верхнем уровне перехватывать все пролезшие исключения, производить ряд тестов, делать минидамп памяти, засовывать все отчеты в архив и отправлять все это в техподдержку. Я знаю как это реализовать в Windows, даже уже сделал это, необходимо сделать что-то подобное для Linux, но я не знаю как делать minidump в Linux. В Windows это делается при помощи функции MiniDumpWriteDump А как в Linux? Можно какой-нибудь пример? Слышал, что в Linux система сама делает минидамп приложения, но тогда я не смогу сделать архив с отчетом и отправить все это в техподдержку, т.к. как я понимаю программа сначала аварийно завершится, после чего Linux сделает его minidump. Как быть? Подскажите, пожалуйста. |
| Автор: bilbobagginz 25.2.2010, 23:26 |
| ajuvolkov, "при падении приложения" - широко сказано. при опр. условиях система сама создает core dump. но надо осторожно с ним быть, и ограничить его через ulimit. почитай на тему core в линуксе (через гугл), там описываются условия при к-рых файл создается. |
| Автор: svlary 27.2.2010, 11:18 | ||||
Например, вот так :
|
| Автор: ajuvolkov 3.3.2010, 10:25 | ||||
| Спасибо за совет. Все вроде понятно, но только не ясны условия при которых создается дамп. Я с недавнего времени программирую под Linux, по этому еще плохо ориентируюсь в этой тематике. В windows все просто - перехватил все пролезшие исключения на верхнем уровне (например в функции main), сделал дамп, тесты, запихнул все в архив, отправил в техподдержку информацию и закрыл приложение. А как быть в Linux? Если я таким же макаром перехвачу исключения, dump же не создастся? Добавлено через 12 минут и 59 секунд Добавлено @ 10:36
Ааа, все кажется разобрался. Нужно использовать функцию
для сигналов SIGILL - Illegal Instruction SIGABRT - Abort signal from abort(3) SIGFPE - Floating point exception SIGSEGV - Invalid memory reference SIGSYS - Bad argument to routine (SVr4) SIGTRAP - Trace/breakpoint trap SIGXCPU - CPU time limit exceeded (4.2BSD) SIGXFSZ - File size limit exceeded (4.2BSD) Я правильно понял? Не понятно почему сигнал SIGQUIT - Quit from keyboard тоже вызывает создание минидампа? Это верно или я что - то не так понял из документации? |
| Автор: svlary 4.3.2010, 07:34 | ||||||||||
В моем посте речь шла о дампе, который создается системой АВТОМАТИЧЕСКИ. Т.е. речь шла только о том, разрешить системе это делать, или запретить.
Если Вы перехватили прерывание, то и обрабатывайте его! Иначе - зачем вы его перехватывли ?! Правда, есть способ, после своей обработки предать прерывание на стандартную... Но я не очень понимаю - зачем. Вы же вот что собираетесь делать :
Система этого делать не будет... Кроме дампа.
Ну, если разобрались - хорошо! Но дело это не сильно простое, поэтому приведу здесь пример, как я это делаю у себя :
Два пояснения :
Про условия, при которых backtrace будет работать удовлетворительно - смотрите доку на Вашей системе. |
| Автор: MAKCim 4.3.2010, 10:23 |
| svlary, для SIGSEGV лучше заюзать SA_ONSTACK и статический буфер в первом sigprocmask лучше сохранить текущую маску и восстановить ее в последнем |
| Автор: ajuvolkov 4.3.2010, 15:29 | ||||||||
| Спасибо за помощь, я уже близок к цели )))))))) svlary:
Все это мне нужно для того, чтобы реализовать в приложении механизм отправки отчета об ошибках к нам в компанию. Т.е. если приложение валится у клиента, то выводится сообщение, на подобии сообщений о проблемах в приложениях Microsoft. Мол что произошла критическая ошибка, приложение будет закрыто, отправить информацию о ошибке в компанию XXXXXXXX? Если пользователь жмет ок, то программа выполняет некоторые тесты, формирует отчет, в котором находятся результаты этих тестов и дамп памяти, записывает все это в архив, соединяется с почтовым сервером компании по протоколу SMTP и отсылает туда этот архив. Все это уже работает под Windows. Осталось сделать под Linux. Впринципе, функции формирования отчета и отправки по почте работают у меня и под Linux. Задача состоит в том как мне сделать dump. Вырезка из кода:
При возникновении критической ситуации вызывается on_coredump, в этой функции проводится ряд тестов и формируется отчет, но к этому моменту дампа памяти еще нет. Как его создать? Т.е. я уже знаю что приложение на грани фола, и мне нужен дамп, чтобы заказчик отправил мне его по почте и я смог у себя на работе найти, где проблема, изучая этот дам. Вот для этого все это мне нужно. Пробовал сам принудительно рушить приложение путем простого деления на ноль. Функция on_coredump вызывается. Но она вызывается постоянно. Т.е. как только она отработала, она вызывается снова и, к стати, файла дампа нет в папке с приложением. Дамп, как я понимаю, создастся, когда приложение окончательно рухнет? Теперь я понятно изложил проблему? Или еще не до конца ясно, что я хочу реализовать? |
| Автор: svlary 5.3.2010, 07:23 |
| - с замечаниями полностью согласен, но... Лучшее - враг Хорошего! |
| Автор: svlary 5.3.2010, 08:26 |
| - Ну почему же?! Вполне ясно. |
| Автор: ajuvolkov 5.3.2010, 10:52 | ||
Да хочется свое, тем более что уже почти все готово =) Готов и работает все, кроме сохранения дампа в Линукс. В Windows все уже хорошо работает |
| Автор: ajuvolkov 5.3.2010, 15:14 | ||||
Спасибо за помощь. Попробую реализовать. |
| Автор: ajuvolkov 10.3.2010, 10:53 | ||||||
Что-то я не очень понимаю каким образом отловить момент создания корки в дочернем процессе =( |
| Автор: MAKCim 10.3.2010, 11:26 | ||
WCOREDUMP(status) man 2 wait |
| Автор: ajuvolkov 10.3.2010, 11:57 | ||||
Спасибо, уже нашел отличную статью в Linux Format Magazine Кому интересно, ее можно прочесть здесь http://www.scribd.com/doc/2248668/Linux-Format-Magazine-85 страницы 100-103 |
| Автор: ajuvolkov 10.3.2010, 15:10 | ||||||
Все, все получилось сделать, всем спасибо!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! |