Есть ли функция для вызова дампа стека в C?

Может ли кто-нибудь запросить реализацию функции C, которая вызывается для сброса текущего стека? Это для системы x86 linux. Его можно вызвать двумя способами: явно с помощью другой функции или после сбоя (возможно, как обработчик trap/int). Выход может быть либо на экране, либо в файле, как указано параметром (дескриптор). Очевидно, что ясное объяснение/комментарии о том, как стека разматывают, было бы очень полезно. Спасибо.

3 ответа

следующий за ответом Адама, исходный код, показывающий, как выполнять фактическую обратную трассировку стека, находится в gnu libc backtrace(), в /libc/debug/backtrace.c - не уверен, что полная ссылка ниже будет принята stackoverflow html фильтры...

http://cvs.savannah.gnu.org/viewvc/*checkout*/libc/debug/backtrace.c?root=libc&revision=1.1.2.1&content-type=text%2Fplain


Документация для функции backtrace() находится в GNU LIBC MANUAL.


Когда вызовы функций вложены, стек растет вниз и строит цепочку кадров стека. В любой заданной точке программы теоретически возможно выполнить обратную последовательность последовательности кадров стека в исходную вызывающую точку. Функция backtrace() перемещает кадры стека из вызывающей точки в начало программы и предоставляет массив обратных адресов. Реализация backtrace() в библиотеке glibc содержит специфичный для платформы код для каждой платформы.

В случае платформы x86 используются содержимое регистров CPU *** (базовый указатель) и esp (стековый указатель), которые содержат адрес текущего стекового кадра и указателя стека для любой заданной функции следить за цепочкой указателей и переходить к исходной структуре стека. Это позволяет собирать последовательность обратных адресов для построения обратной линии.

Если вы хотите узнать больше о том, как работает backtrace() и как его использовать, я бы рекомендовал прочитать Stack Backtracing Inside Your Программа (журнал LINUX).

Поскольку вы упомянули о выполнении backtrace из обработчика сигнала для платформы x86, я хотел бы добавить в ответ Адама и направить вас на мой ответ на вопрос, который он связал, для получения подробной информации о том, как обеспечить обратную трассировку от обработчика сигнала, указывает на фактическое местоположение ошибки.

licensed under cc by-sa 3.0 with attribution.