Обработка сигналов POSIX: как получить трассировку стека без использования backtrace_symbols?

Я пытаюсь добавить простую регистрацию сбоев в свое приложение C ++ для Mac OS и Linux. Я не доволен backtrace_symbols выход. Я хотел бы взять что угодно backtrace() возвращает и создает трассировку стека (с символическими именами) вручную. Как это сделать? Я не смог найти ни одного примера или даже объяснения того, что именно backtrace() возвращается.

Upd: найдено этот фрагмент кода, но он не компилируется в OS X.

0

Решение

libunwind имеет unw_get_proc_name функция, которая даст вам искаженное имя функции для стекового фрейма. В документации утверждается, что unw_get_proc_name безопасен в обработчике сигналов. В соответствии с этот, backtrace_symbols использует malloc и поэтому не безопасно использовать в обработчике сигналов POSIX.

Я не знаю, как это назвать с какой бы то ни было обратной трассировкой, поэтому вам, вероятно, придется использовать libunwind для этого.

2

Другие решения

Смотря на справочная страница для backtrace (), Я вижу, что backtrace возвращает указатель на массив, содержащий кучу адресов.

backtrace_symbols() преобразует эти адреса в символы, как он видит, если есть символы отладки. В противном случае вы получите адрес.

Сказав это, нет смысла не использовать backtrace_symbols(), Если вам не нравится вывод, не стесняйтесь изменять его, но вы не получите более полезной информации о трассировке.

В приведенном вами примере они подражают backtrace_symbols() в плохом смысле. Также обратите внимание на первый комментарий:

A hacky replacement for backtrace_symbols in glibc
1

По вопросам рекламы [email protected]