Есть ли функция, чтобы вызвать дамп стека в C? - PullRequest
3 голосов
/ 03 октября 2008

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

Ответы [ 3 ]

2 голосов
/ 05 октября 2008

Документация по функции backtrace () содержится в РУКОВОДСТВЕ ПО БИБЛИОТЕКЕ GNU .

2 голосов
/ 03 октября 2008

после ответа Адама исходный код, который показывает, как выполнить реальное отслеживание стека, находится в backtrace () gnu libc, в /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

0 голосов
/ 02 марта 2010

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

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

Если вы хотите узнать больше информации о том, как работает backtrace() и как его использовать, я бы порекомендовал прочитать Восстановление стека внутри вашей программы (Журнал LINUX).


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

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