Implement the backtrace code.
This commit is contained in:
parent
8ef5e2f810
commit
dd3281aba0
|
@ -25,6 +25,7 @@ struct Command {
|
||||||
static struct Command commands[] = {
|
static struct Command commands[] = {
|
||||||
{ "help", "Display this list of commands", mon_help },
|
{ "help", "Display this list of commands", mon_help },
|
||||||
{ "kerninfo", "Display information about the kernel", mon_kerninfo },
|
{ "kerninfo", "Display information about the kernel", mon_kerninfo },
|
||||||
|
{ "backtrace", "Display current backtrace", mon_backtrace }
|
||||||
};
|
};
|
||||||
|
|
||||||
/***** Implementations of basic kernel monitor commands *****/
|
/***** Implementations of basic kernel monitor commands *****/
|
||||||
|
@ -61,6 +62,25 @@ mon_backtrace(int argc, char **argv, struct Trapframe *tf)
|
||||||
// LAB 1: Your code here.
|
// LAB 1: Your code here.
|
||||||
// HINT 1: use read_ebp().
|
// HINT 1: use read_ebp().
|
||||||
// HINT 2: print the current ebp on the first line (not current_ebp[0])
|
// HINT 2: print the current ebp on the first line (not current_ebp[0])
|
||||||
|
uint32_t* ebp;
|
||||||
|
uint32_t eip;
|
||||||
|
struct Eipdebuginfo info;
|
||||||
|
|
||||||
|
ebp = (uint32_t*) read_ebp();
|
||||||
|
cprintf("Stack backtrace:\n");
|
||||||
|
while(ebp) {
|
||||||
|
eip = ebp[1];
|
||||||
|
cprintf(" ebp %08x eip %08x args %08x %08x %08x %08x %08x\n",
|
||||||
|
ebp, eip, ebp[2], ebp[3], ebp[4], ebp[5], ebp[6]);
|
||||||
|
ebp = (uint32_t*) ebp[0];
|
||||||
|
|
||||||
|
debuginfo_eip(eip, &info);
|
||||||
|
cprintf(" %s:%d: %.*s+%d\n",
|
||||||
|
info.eip_file, info.eip_line,
|
||||||
|
info.eip_fn_namelen, info.eip_fn_name,
|
||||||
|
eip - info.eip_fn_addr);
|
||||||
|
};
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user