Когда вызовы функций вложены, стек увеличивается и формирует цепочку кадров стека. В любой заданной точке программы теоретически возможно отследить последовательность кадров стека до исходной точки вызова. Функция backtrace()
перемещает кадры стека от вызывающей точки до начала программы и предоставляет массив адресов возврата. Реализация backtrace()
в библиотеке glibc содержит специфичный для платформы код для каждой платформы.
В случае платформы x86 используется содержимое регистров CPU ebp (базовый указатель) и esp (указатель стека), которые содержат адрес текущего фрейма стека и указателя стека для любой заданной функции. следовать цепочке указателей и перейти к исходному кадру стека. Это позволяет собирать последовательность адресов возврата для построения обратной трассировки.
Если вы хотите узнать больше информации о том, как работает backtrace()
и как его использовать, я бы порекомендовал прочитать Восстановление стека внутри вашей программы (Журнал LINUX).
Поскольку вы упомянули о выполнении возврата из обработчика сигналов для платформы x86, я хотел бы добавить к ответ Адама и направить вас к моему ответу на вопрос, с которым он связался, для получения подробной информации о том, как обеспечить обратный след от обработчика сигнала, указывает на фактическое местонахождение неисправности.