как показать трассировку стека в Linux?

Я использую g ++ 4.9.2 на Solaris 10, а также на Linux. Я использую обработчик сигнала. Всякий раз, когда есть сигнал, я хотел бы показать трассировку стека.
Как мне показать трассировку стека в Linux?

1

Решение

Есть backtrace Семейство функций, которые делают это. Смотрите man-страницу для примеров.

1

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

В принципе, обработчик сигнала может вызывать только (небольшой) набор функций, только так называемый безопасные функции асинхронного сигнала (что исключает backtrace из GNU libc, как предложено Ответ Максима). Читать Сигнал (7).

На практике, особенно если вы хотите показать только обратную трассировку, а затем прервать ее, вам может быть все равно. Посмотрите также на Яна Тейлора libbacktrace который анализирует отладочную информацию DWARF (так что вы лучше скомпилируете свой код с -g флаг для gcc или же g++, возможно, в дополнение к таким флагам оптимизации, как -O2). Внутри GCC он практически используется для создания хорошей обратной трассировки на плохих сигналах (включая ошибки сегментации, т.е. SIGSEGV) от их обработчиков сигналов и работает довольно хорошо большую часть времени. Затем вы должны использовать последнюю версию GCC, например, GCC 6

1

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