Какие существуют библиотеки для ловли исключений и их отправки?

Доброго времени суток!
Я уже обыскался ответа, но так и не нашёл.
Я использую 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), но там не написанно, как внедрить это в свой проект. Какие библиотеки можно использовать для этого?
Заранее спасибо!
  • Вопрос задан
  • 279 просмотров
Решения вопроса 1
Profi_GMan
@Profi_GMan Автор вопроса
В общем библиотека - google breakpad.
Нужно сначала её собрать. И вот как я это сделал:
Для начала нужно закинуть в папку папка_с_брикпадом\src\third_party вот это (библиотека lss) https://yadi.sk/d/BmWlgUmx3SHqka
На линукс Просто полностью её скачал, после чего в корневой папке сделал ./configure && make. После этого .а файл будет в папка_с_breakpad\src\client\linux\libbreakpad_client.a
На винде, я создал вот такой вот .pro файл в корневой папке breakpad и скомпилировал его:
spoiler
TEMPLATE = lib
CONFIG += staticlib

INCLUDEPATH += $$PWD
INCLUDEPATH += $$PWD/src

# Windows
win32:HEADERS += $$PWD/src/common/windows/string_utils-inl.h
win32:HEADERS += $$PWD/src/common/windows/guid_string.h
win32:HEADERS += $$PWD/src/client/windows/handler/exception_handler.h
win32:HEADERS += $$PWD/src/client/windows/common/ipc_protocol.h
win32:HEADERS += $$PWD/src/google_breakpad/common/minidump_format.h
win32:HEADERS += $$PWD/src/google_breakpad/common/breakpad_types.h
win32:HEADERS += $$PWD/src/client/windows/crash_generation/crash_generation_client.h
win32:HEADERS += $$PWD/src/common/scoped_ptr.h
win32:SOURCES += $$PWD/src/client/windows/handler/exception_handler.cc
win32:SOURCES += $$PWD/src/common/windows/string_utils.cc
win32:SOURCES += $$PWD/src/common/windows/guid_string.cc
win32:SOURCES += $$PWD/src/client/windows/crash_generation/crash_generation_client.cc

после чего, в корневой папке появится .а файл
Теперь нужно его (.а файл) подключить (в qt это LIBS += путь\имя.a в про файле) и дальше подключать стоит только заголовочный файл client/windows/sender/crash_report_sender.h для винды и client/linux/sender/crash_report_sender.h и всё. О том, что делать далбше можно прочитать здесь:
https://maxsavenkov.livejournal.com/189460.html для винды
https://gist.github.com/byronwind/94c94ee00dc442c71638 для linux
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы