Подтвердить что ты не робот

Может ли приложение программно генерировать собственный стек?

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

Спасибо.

4b9b3361

Ответ 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.