Я пытаюсь добавить простую регистрацию сбоев в свое приложение C ++ для Mac OS и Linux. Я не доволен backtrace_symbols
выход. Я хотел бы взять что угодно backtrace()
возвращает и создает трассировку стека (с символическими именами) вручную. Как это сделать? Я не смог найти ни одного примера или даже объяснения того, что именно backtrace()
возвращается.
Upd: найдено этот фрагмент кода, но он не компилируется в OS X.
libunwind имеет unw_get_proc_name функция, которая даст вам искаженное имя функции для стекового фрейма. В документации утверждается, что unw_get_proc_name безопасен в обработчике сигналов. В соответствии с этот, backtrace_symbols использует malloc и поэтому не безопасно использовать в обработчике сигналов POSIX.
Я не знаю, как это назвать с какой бы то ни было обратной трассировкой, поэтому вам, вероятно, придется использовать libunwind для этого.
Смотря на справочная страница для backtrace (), Я вижу, что backtrace
возвращает указатель на массив, содержащий кучу адресов.
backtrace_symbols()
преобразует эти адреса в символы, как он видит, если есть символы отладки. В противном случае вы получите адрес.
Сказав это, нет смысла не использовать backtrace_symbols()
, Если вам не нравится вывод, не стесняйтесь изменять его, но вы не получите более полезной информации о трассировке.
В приведенном вами примере они подражают backtrace_symbols()
в плохом смысле. Также обратите внимание на первый комментарий:
A hacky replacement for backtrace_symbols in glibc