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