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

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

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

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

Документация для функции backtrace () приведена в РУКОВОДСТВЕ LIBC GNU .

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

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

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


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