Может ли приложение программно генерировать собственный стек?
У меня есть программа, написанная на C, которая работает на Linux, MacOS и Windows. Есть ли способ, которым я могу вызвать функцию и создать трассировку стека? Это было бы очень полезно для меня. В идеале я хотел бы сделать это на всех трех платформах, но Linux является самым важным. (Windows скомпилируется через mingw.)
Спасибо.
Ответы
Ответ 1
Например, в GCC и библиотеке GNU libc
C вы можете использовать backtrace()
.
Как показывает @slugonamission, Windows предлагает CaptureStackBackTrace()
- спасибо!
Другие платформы могут предлагать аналогичные функции.
(Это, очевидно, вопрос, зависящий от платформы).
(В соответствующей заметке также существуют библиотеки саморазборка.)
Ответ 2
Я использую этот код для генерации трассировки стека отладки. Он использует libunwind для получения stacktrace и libdwfl для чтения отладочной информации.
Он создает приятные трассировки стека Java, с именами функций и местоположениями источников. например:.
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.
Ответ 3
Иан Лэнс Тейлор libbacktrace делает это. Он обрабатывает разматывание стека и обеспечивает поддержку отладочных символов DWARF.
https://github.com/ErwanLegrand/libbacktrace
Он поддерживает только ELF.