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