Я использую g ++ 4.9.2 на Solaris 10, а также на Linux. Я использую обработчик сигнала. Всякий раз, когда есть сигнал, я хотел бы показать трассировку стека.
Как мне показать трассировку стека в Linux?
Есть backtrace
Семейство функций, которые делают это. Смотрите man-страницу для примеров.
В принципе, обработчик сигнала может вызывать только (небольшой) набор функций, только так называемый безопасные функции асинхронного сигнала (что исключает backtrace
из GNU libc, как предложено Ответ Максима). Читать Сигнал (7).
На практике, особенно если вы хотите показать только обратную трассировку, а затем прервать ее, вам может быть все равно. Посмотрите также на Яна Тейлора libbacktrace который анализирует отладочную информацию DWARF (так что вы лучше скомпилируете свой код с -g
флаг для gcc
или же g++
, возможно, в дополнение к таким флагам оптимизации, как -O2
). Внутри GCC он практически используется для создания хорошей обратной трассировки на плохих сигналах (включая ошибки сегментации, т.е. SIGSEGV
) от их обработчиков сигналов и работает довольно хорошо большую часть времени. Затем вы должны использовать последнюю версию GCC, например, GCC 6