Implement the backtrace code.
This commit is contained in:
		
							parent
							
								
									8ef5e2f810
								
							
						
					
					
						commit
						dd3281aba0
					
				| @ -25,6 +25,7 @@ struct Command { | ||||
| static struct Command commands[] = { | ||||
| 	{ "help", "Display this list of commands", mon_help }, | ||||
| 	{ "kerninfo", "Display information about the kernel", mon_kerninfo }, | ||||
| 	{ "backtrace", "Display current backtrace", mon_backtrace } | ||||
| }; | ||||
| 
 | ||||
| /***** Implementations of basic kernel monitor commands *****/ | ||||
| @ -61,6 +62,25 @@ mon_backtrace(int argc, char **argv, struct Trapframe *tf) | ||||
| 	// LAB 1: Your code here.
 | ||||
|     // HINT 1: use read_ebp().
 | ||||
|     // 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; | ||||
| } | ||||
| 
 | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user