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





Следуя ответу Адама, исходный код, показывающий, как выполнить фактическую обратную трассировку стека, находится в gnu libc backtrace (), в /libc/debug/backtrace.c - не уверен, будет ли полная ссылка ниже будет принята html-фильтрами stackoverflow. ..
Документация по функции backtrace () находится в РУКОВОДСТВО ПО GNU LIBC.
Когда вызовы функций вложены, стек растет вниз и выстраивает цепочку кадров стека. В любой заданной точке программы теоретически возможно проследить последовательность кадров стека до исходной точки вызова. Функция backtrace() перемещает кадры стека от точки вызова до начала программы и предоставляет массив адресов возврата. Реализация backtrace() в библиотеке glibc содержит программно-зависимый код для каждой платформы.
В случае платформы x86 содержимое регистров процессора ebp (базовый указатель) и esp (указатель стека), которые содержат адрес текущего кадра стека и указателя стека для любой заданной функции, используется для отслеживания цепочку указателей и перейти к начальному кадру стека. Это позволяет собрать последовательность адресов возврата для построения обратной трассировки.
Если вы хотите узнать больше о том, как работает backtrace() и как его использовать, я бы рекомендовал прочитать Отслеживание стека внутри вашей программы (LINUX Journal).
Поскольку вы упомянули выполнение обратной трассировки от обработчика сигнала для платформы x86, я хотел бы добавить к Ответ адама и направить вас к мой ответ к вопросу, на который он ссылается, для получения подробной информации о том, как обеспечить обратную трассировку от обработчика сигнала, указывающего на фактическое местоположение. вины.
Вы напрямую ищете текстовый вывод стека вызовов или двоичный дамп ядра тоже подойдет вам?