#include #include void backtrace(); int main() { backtrace(); return 0; } void backtrace() { // At first I fetch the interesting registers ... // I'll write sp for stack pointer and fp for fp register long unsigned *plFp asm("r3"); // fp or old sp register long unsigned *plSp asm("r30"); // sp register long unsigned *r2 asm("r2"); // rp // To get the return pointer rp I could use r2 but I want to // walk from sp because I can't get r2 and rp of the functionsi that called // backtrace unsigned long *plStack, *saved_rp, *pc; saved_rp = (unsigned long*)((long)(plSp)- 4*5); // or // saved_rp = plSp - 5; // At http://devrsrc1.external.hp.com/STK/partner/rad_11_0_32.pdf // p. 72 I've read that at the position sp - 20 Byte // the saved rp can be fetched. This works. cout << "The adresses: saved_rp = " << saved_rp << ", plSp = " << plSp << endl; pc = (unsigned long*)(*saved_rp + 5); // cout << "r2 = " << r2 << " pc = " << pc << " *saved_rp = " << *saved_rp << endl; // But at the same page can be read that at sp - 4 the previous // sp can be fetched. Sadly that doesn't work ;( plStack = (unsigned long*)((long)(plSp) - 4); cout << "sp = " << plSp <<" fp = " << plFp << " plStack = " << plStack << endl << "*sp = " << *plSp <<" *fp = " << *plFp << " *plStack = " << *plStack << endl; // also the program shows *plSp != 1 gdb shows 1 here }