#include "stack.h" #include "types.h" #include "vga.h" extern vaddr_t _stack_bottom; extern vaddr_t _stack_top; void printStackTrace(unsigned int maxFrames) { #ifdef DEBUG // Now on Stack: // ( potential second function argument ) // first function argument (maxFrames) // return address from caller // EBP (Extended Base Pointer) of calling function // // retrace function from address could done by optaining function address with gdb or // objdump -S kernel unsigned int *ebp = __builtin_frame_address(0); for (unsigned int frame = 0; frame < maxFrames; frame++) { unsigned int eip = ebp[1]; if (eip == 0) { // No caller on stack break; } unsigned int *arguments = ebp + 2; printf("[%d] 0x%x (", frame, eip); int nbArg = 0; do { if ((_stack_bottom <= (vaddr_t)arguments) && ((vaddr_t)arguments <= _stack_top)) { printf(" 0x%x", *arguments); arguments += 1; } else { break; } nbArg++; if (nbArg >= 4) { break; } } while (1); printf(")\n"); ebp = (unsigned int *)(ebp[0]); } #else printf("Must be compiled with -fno-omit-frame-pointer for full stack\n"); unsigned int *ebp = &maxFrames - 2; unsigned int eip = ebp[1]; printf("[0] 0x%x\n", eip); #endif }