Доброго времени суток!
Я уже обыскался ответа, но так и не нашёл.
Я использую qt.
Мне нужно сделать, чтобы все вылеты программы, т.е. исключения фиксировались и выводилось сообщение об ошибке.
Я поступил так: обычные исключения я отлавливаю с помощью catch(). Исключения, такие как sigsegv, я отлавливаю с помощью
SetUnhandledExceptionFilter() в винде и sigaction() в линукс. Также я ещё поставил std::set_terminate(). После чего выводится backtrace, если это винда, создаётся мини-дамп и выводится на экран ошибка с описанием.
Но есть несколько проблем:
1. Если ошибка происходит в другом потоке (а у меня они только там и происходят), то программа во-первых не дожидается нажатия "ок" в сообщении об ошибке и закрывается, а во-вторых, после закрытия, поток остаёться работать, и даже QProcess::startDetached("taskkill ...") не помагает
2. Теперь самое важное. Как получить место, где произошла ошибка? С помощью минидампа можно получить только в случае, если программа скомпилированна в режиме дебаг и если ошибка произошла непосредственно в коде программы, но если я передал в функцию qt неправильный указатель, то я получу место в этой функции, а не место, где она была вызвана.
3. Чтобы получить нормальный бектрейс и место ошибки, мне нужно компилировать в дебаг программу, но тогда она вместе со всеми длл будет весить 500 мб.
4. std::set_terminate() устанавливается только для одного потока. Как установить для всех?
Как всё это реализовать? Нагуглил я crashrpt, но у меня mingw и он не кроссплатформен. Ещё я нашёл Google breakpad и его одаптацию под qt (
https://github.com/dschmidt/libcrashreporter-qt), но там не написанно, как внедрить это в свой проект. Какие библиотеки можно использовать для этого?
Заранее спасибо!