Может ли приложение программно генерировать свою собственную трассировку стека? - PullRequest
14 голосов
/ 07 ноября 2011

У меня есть программа, написанная на C, которая работает на Linux, MacOS и Windows.Есть ли способ, которым я могу вызвать функцию и генерировать трассировку стека?Это было бы очень полезно для меня.В идеале я хотел бы сделать это на всех трех платформах, но Linux является наиболее важным.(Windows компилируется через mingw.)

Спасибо.

Ответы [ 3 ]

7 голосов
/ 07 ноября 2011

Например, в GCC и библиотеке GNU libc C вы можете использовать backtrace().

Как подсказывает @slugonamission, Windows предлагает CaptureStackBackTrace() - спасибо!

Другие платформы могут предлагать аналогичные функции.

(Это, очевидно, вопрос, зависящий от платформы.)

(В связанной заметке также существуют библиотеки для самостоятельной разборки .)

5 голосов
/ 07 ноября 2011

Я использую этот код для генерации трассировки стека отладки. Он использует libunwind для получения трассировки стека и libdwfl для чтения отладочной информации.

Он производит приятные Java-подобные трассировки стека с именами функций и местами расположения источников. eg.:

at c(stack_trace.c:95)
at b(stack_trace.c:100)
at a(stack_trace.c:105)
at main(stack_trace.c:110)

libunwind должен работать на Windows и Mac, но libdwfl специфичен для Linux и ELF.

1 голос
/ 27 мая 2015

Libbetrace Ian Lance Taylor делает это.Он обрабатывает раскручивание стека и поддерживает символы отладки DWARF.

https://github.com/ErwanLegrand/libbacktrace

Хотя поддерживается только ELF.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...