Я хочу иметь способ сообщить трассировку стека пользователю, если выбрасывается исключение. Каков наилучший способ сделать это? Требуется ли огромное количество дополнительного кода?
Чтобы ответить на вопросы:
Я хотел бы, чтобы это было портативно, если возможно. Я хочу, чтобы информация всплывала, чтобы пользователь мог скопировать трассировку стека и отправить ее мне по электронной почте в случае возникновения ошибки.
Linux
неgcc
.libstdc++
(используемый GCC и, возможно, Clang), как объяснено в этом ответе .Ответ Эндрю Гранта не помогает получить трассировку стека функции throwing , по крайней мере, в GCC, поскольку оператор throw не сохраняет текущую трассировку стека самостоятельно, а обработчик catch не будет иметь доступа к трассировке стека в эта точка больше.
Единственный способ - с помощью GCC - решить эту проблему - убедиться, что генерируется трассировка стека в точке инструкции throw, и сохраняется ее с объектом исключения.
Этот метод требует, конечно, чтобы каждый код, который выдает исключение, использовал этот конкретный класс Exception.
Обновление 11 июля 2017 года . Чтобы получить полезный код, взгляните на ответ cahit beyaz, который указывает на http://stacktrace.sourceforge.net - я еще не использовал его, но он выглядит многообещающе.
источник
throw stack_runtime_error
. Правильно ли я пришел к выводу, что этаstd::exception
библиотека работает только для исключений, производных от этого класса, а не для исключений или от сторонних библиотек?Если вы используете Boost 1.65 или выше, вы можете использовать boost :: stacktrace :
источник
Unix: обратный след
Mac: обратная трассировка
Windows: CaptureBackTrace
источник
Я хотел бы добавить стандартную библиотечную опцию (то есть кроссплатформенную), как генерировать трассировки исключений, которая стала доступна в C ++ 11 :
Используйте
std::nested_exception
иstd::throw_with_nested
Это не даст вам раскрутить стек, но, на мой взгляд, следующая лучшая вещь. Здесь и здесь в StackOverflow описывается , как вы можете получить обратную трассировку ваших исключений в вашем коде без необходимости в отладчике или громоздкой регистрации, просто написав соответствующий обработчик исключений, который будет перебрасывать вложенные исключения.
Так как вы можете сделать это с любым производным классом исключений, вы можете добавить много информации к такой обратной трассировке! Вы также можете взглянуть на мой MWE на GitHub , где обратная трассировка будет выглядеть примерно так:
источник
AFAIK libunwind довольно портативен, и до сих пор я не нашел ничего более легкого в использовании.
источник
Я рекомендую http://stacktrace.sourceforge.net/ проект. Он поддерживает Windows, Mac OS, а также Linux
источник
throw stack_runtime_error
. Правильно ли я пришел к выводу, что этаstd::exception
библиотека работает только для исключений, производных от этого класса, а не для исключений или от сторонних библиотек?Если вы используете C ++ и не хотите / не можете использовать Boost, вы можете распечатать обратную трассировку с выделенными именами, используя следующий код [ссылка на оригинальный сайт] .
Обратите внимание, что это решение специфично для Linux. Он использует функции GNU libc backtrace () / backtrace_symbols () (из execinfo.h) для получения обратных следов, а затем использует __cxa_demangle () (из cxxabi.h) для разборки имен символов обратных следов.
НТН!
источник
на Linux с G ++ проверить эту библиотеку
https://sourceforge.net/projects/libcsdbg
это делает всю работу за вас
источник
В Windows проверьте BugTrap . Его больше нет по исходной ссылке, но он все еще доступен в CodeProject.
источник
У меня похожая проблема, и хотя мне нравится переносимость, мне нужна только поддержка gcc. В gcc доступны execinfo.h и обратные вызовы. Чтобы разобрать имена функций, у мистера Бингмана есть хороший фрагмент кода. Чтобы вывести обратную трассировку на исключение, я создаю исключение, которое печатает обратную трассировку в конструкторе. Если бы я ожидал, что это сработает с исключением, сгенерированным в библиотеке, может потребоваться перестройка / компоновка, чтобы использовалось исключение обратного отслеживания.
Компиляция и запуск этого с помощью gcc 4.8.4 дает обратную трассировку с хорошо раскрученными именами функций C ++:
источник
Поскольку стек уже разматывается при входе в блок catch, в моем случае решение состояло в том, чтобы не перехватывать определенные исключения, которые затем приводили к SIGABRT. В обработчике сигналов для SIGABRT я затем выполняю fork () и execl () либо gdb (в сборках отладки), либо стеком Google breakpads (в сборках выпуска). Также я стараюсь использовать только безопасные функции обработчика сигналов.
GDB:
minidump_stackwalk:
Редактировать: чтобы это работало для breakpad, я также должен был добавить это:
Источник: Как получить трассировку стека для C ++, используя gcc с информацией о номере строки? и можно ли подключить gdb к аварийному процессу (он же «отладка по времени»)
источник
Poppy может собирать не только трассировку стека, но и значения параметров, локальные переменные и т. Д. - все, что приводит к сбою.
источник
Следующий код останавливает выполнение сразу после возникновения исключения. Вам необходимо установить обработчик windows_exception_handler и обработчик завершения. Я проверил это в MinGW 32bit.
Проверьте следующий код для функции windows_exception_handler: http://www.codedisqus.com/0ziVPgVPUk/exception-handling-and-stacktrace-under-windows-mingwgcc.html
источник
Cpp-tool ex_diag - легкий, мультиплатформенный, минимальное использование ресурсов, простой и гибкий в трассировке.
источник