![]() |
|
Модераторы: xvr |
![]()
|
|
| ajuvolkov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.9.2009 Репутация: нет Всего: нет |
Всем привет.
Есть кроссплатформенное приложение, в котором нужно реализовать функцию создания отчетов при падении приложения. Т.е. фактически на верхнем уровне перехватывать все пролезшие исключения, производить ряд тестов, делать минидамп памяти, засовывать все отчеты в архив и отправлять все это в техподдержку. Я знаю как это реализовать в Windows, даже уже сделал это, необходимо сделать что-то подобное для Linux, но я не знаю как делать minidump в Linux. В Windows это делается при помощи функции MiniDumpWriteDump А как в Linux? Можно какой-нибудь пример? Слышал, что в Linux система сама делает минидамп приложения, но тогда я не смогу сделать архив с отчетом и отправить все это в техподдержку, т.к. как я понимаю программа сначала аварийно завершится, после чего Linux сделает его minidump. Как быть? Подскажите, пожалуйста. |
|||
|
||||
| bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: 4 Всего: 317 |
ajuvolkov, "при падении приложения" - широко сказано.
при опр. условиях система сама создает core dump. но надо осторожно с ним быть, и ограничить его через ulimit. почитай на тему core в линуксе (через гугл), там описываются условия при к-рых файл создается. -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
| svlary |
|
||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
Например, вот так :
|
||||
|
|||||
| ajuvolkov |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.9.2009 Репутация: нет Всего: нет |
Спасибо за совет. Все вроде понятно, но только не ясны условия при которых создается дамп.
Я с недавнего времени программирую под 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 тоже вызывает создание минидампа? Это верно или я что - то не так понял из документации? Это сообщение отредактировал(а) ajuvolkov - 3.3.2010, 10:38 |
||||
|
|||||
| svlary |
|
||||||||||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
В моем посте речь шла о дампе, который создается системой АВТОМАТИЧЕСКИ. Т.е. речь шла только о том, разрешить системе это делать, или запретить.
Если Вы перехватили прерывание, то и обрабатывайте его! Иначе - зачем вы его перехватывли ?! Правда, есть способ, после своей обработки предать прерывание на стандартную... Но я не очень понимаю - зачем. Вы же вот что собираетесь делать :
Система этого делать не будет... Кроме дампа.
Ну, если разобрались - хорошо! Но дело это не сильно простое, поэтому приведу здесь пример, как я это делаю у себя :
Два пояснения :
Про условия, при которых backtrace будет работать удовлетворительно - смотрите доку на Вашей системе. |
||||||||||
|
|||||||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
svlary,
для SIGSEGV лучше заюзать SA_ONSTACK и статический буфер в первом sigprocmask лучше сохранить текущую маску и восстановить ее в последнем -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| ajuvolkov |
|
||||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.9.2009 Репутация: нет Всего: нет |
Спасибо за помощь, я уже близок к цели ))))))))
svlary:
Все это мне нужно для того, чтобы реализовать в приложении механизм отправки отчета об ошибках к нам в компанию. Т.е. если приложение валится у клиента, то выводится сообщение, на подобии сообщений о проблемах в приложениях Microsoft. Мол что произошла критическая ошибка, приложение будет закрыто, отправить информацию о ошибке в компанию XXXXXXXX? Если пользователь жмет ок, то программа выполняет некоторые тесты, формирует отчет, в котором находятся результаты этих тестов и дамп памяти, записывает все это в архив, соединяется с почтовым сервером компании по протоколу SMTP и отсылает туда этот архив. Все это уже работает под Windows. Осталось сделать под Linux. Впринципе, функции формирования отчета и отправки по почте работают у меня и под Linux. Задача состоит в том как мне сделать dump. Вырезка из кода:
При возникновении критической ситуации вызывается on_coredump, в этой функции проводится ряд тестов и формируется отчет, но к этому моменту дампа памяти еще нет. Как его создать? Т.е. я уже знаю что приложение на грани фола, и мне нужен дамп, чтобы заказчик отправил мне его по почте и я смог у себя на работе найти, где проблема, изучая этот дам. Вот для этого все это мне нужно. Пробовал сам принудительно рушить приложение путем простого деления на ноль. Функция on_coredump вызывается. Но она вызывается постоянно. Т.е. как только она отработала, она вызывается снова и, к стати, файла дампа нет в папке с приложением. Дамп, как я понимаю, создастся, когда приложение окончательно рухнет? Теперь я понятно изложил проблему? Или еще не до конца ясно, что я хочу реализовать? |
||||||||
|
|||||||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
||||
|
||||
| svlary |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 207 Регистрация: 8.9.2009 Репутация: 4 Всего: 4 |
- Ну почему же?! Вполне ясно.
|
|||
|
||||
| ajuvolkov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.9.2009 Репутация: нет Всего: нет |
Да хочется свое, тем более что уже почти все готово =) Готов и работает все, кроме сохранения дампа в Линукс. В Windows все уже хорошо работает |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
просто поставь SIG_DFL на SIGSEGV в обработчике и создай новый процесс далее дефолтный обработчик libc вернет управление на инструкцию, вызвавшую исключение процесс завершится с созданием корки, из дочернего процесса это отслеживается как создастся корка, можем делать с ней, все что угодно либо можно изначально создать процесс-монитор, так даже правильнее а всю инфу, необходимую для формирования отчета, передаем из обработчика сигнал через пайп -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| ajuvolkov |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.9.2009 Репутация: нет Всего: нет |
Спасибо за помощь. Попробую реализовать. |
|||
|
||||
| ajuvolkov |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.9.2009 Репутация: нет Всего: нет |
Что-то я не очень понимаю каким образом отловить момент создания корки в дочернем процессе =( |
||||||
|
|||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 84 Всего: 207 |
WCOREDUMP(status) man 2 wait -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| ajuvolkov |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 8.9.2009 Репутация: нет Всего: нет |
Спасибо, уже нашел отличную статью в Linux Format Magazine Кому интересно, ее можно прочесть здесь http://www.scribd.com/doc/2248668/Linux-Format-Magazine-85 страницы 100-103 Это сообщение отредактировал(а) ajuvolkov - 10.3.2010, 11:58 |
||||
|
|||||
![]()
|
| Правила форума "С/С++: Программирование под Unix/Linux" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |