Как мы можем получить имя функции из Spack Pointer (reg / SP) в Linux? - PullRequest
1 голос
/ 15 апреля 2010

Я использую ptrace для получения информации, связанной с Callstack в Linux. я могу получить Spack Pointer в мой стек, используя регистр, возвращаемый ptarces. но используя этот указатель стека, как я могу получить информацию, связанную с именем функции и подписью текущего стека вызовов?

Существуют ли какие-либо API-интерфейсы Linux для обхода этого стека вызовов?

пожалуйста, помогите .. я ищу его в последние несколько дней ...

спасибо заранее Sandeep

Ответы [ 2 ]

0 голосов
/ 16 апреля 2010

Я настоятельно рекомендую использовать libunwind в этом случае. Он предоставляет хороший API для обхода стека вызовов. Это зависит от наличия заголовка .eh_frame в объектном файле. Может использоваться как в локальном, так и в удаленном (ваш вариант использования) контекстах. Разматывание стека не зависит от информации DWARF или отладочных сборок.

0 голосов
/ 16 апреля 2010

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

На x86 регистр %eip будетсодержит адрес памяти в коде выполняемой в данный момент функции.Регистр %ebp будет указывать на место в стеке, где хранится предыдущее значение %ebp, за которым следует возвращаемое значение.Вам нужно следовать этой цепочке %ebp значений, записывая адреса возврата по мере того, как вы идете.

Затем вам нужно прочитать отладочную информацию DWARF в двоичном файле, который вы отлаживаете, чтобы преобразовать адреса кода обратно в функциюnames.

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

...