Exemplo n.º 1
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	
	func_info * func_ptr = 0;
	char format[150];
	char formatEIP[150];
	struct Eipdebuginfo info;
	strcpy(format,"ebp %08x eip %08x args %08x %08x %08x %08x %08x\n");
	strcpy(formatEIP, "\t%s:%d: %.*s+%d\n");
	cprintf("Stack backtrace:\n"); 
	func_ptr = (func_info*)read_ebp();
	while(func_ptr != NULL){
		
		cprintf(format,func_ptr,func_ptr->eip,func_ptr->args[0],func_ptr->args[1]
								 , func_ptr->args[2], func_ptr->args[3],func_ptr->args[4]);
		debuginfo_eip((uintptr_t)func_ptr->eip,&info);
		cprintf(formatEIP,
				info.eip_file,
				info.eip_line,
				info.eip_fn_namelen,
				(char*)info.eip_fn_name,(uintptr_t)func_ptr->eip - info.eip_fn_addr);
		func_ptr  = (func_info*) func_ptr->prevfunc_ebp;	
		
	}
	return 0;
}
Exemplo n.º 2
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	unsigned ebp = read_ebp();
	while (ebp) {
		struct Eipdebuginfo info;
		unsigned eip = *((unsigned *)ebp + 1);
		debuginfo_eip(eip, &info);
		cprintf("ebp %08x eip %08x args %08x %08x %08x %08x %08x %s:%d: %.*s+%d\n",
			      ebp,
			      eip,
			      *((unsigned *)ebp + 2),
			      *((unsigned *)ebp + 3),
			      *((unsigned *)ebp + 4),
			      *((unsigned *)ebp + 5),
			      *((unsigned *)ebp + 6),
			      info.eip_file,
			      info.eip_line,
			      info.eip_fn_namelen, info.eip_fn_name,
			      (char*)eip - (char*)info.eip_fn_addr);

		ebp = *(unsigned*)ebp;
	}
	return 0;
}
Exemplo n.º 3
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	uint32_t ebp,eip;
	struct Eipdebuginfo info;
	int i=0;

	ebp=read_ebp();
	while(ebp != 0) {
		eip = *((uint32_t *)(ebp+4));
		// change ip to addr
		// debuginfo_eip(uintptr_t addr, struct Eipdebuginfo *info)
		debuginfo_eip((uintptr_t)eip,&info);
		cprintf("ebp %0x eip %0x ",ebp,eip);
		cprintf("args ");
		for(i=0;i<=4;i++)
			cprintf("%0x ",*(uint32_t *)(ebp+8+4*i));
		cprintf("\n");
		cprintf("	eipfile: %s	eipfunc: %s ",info.eip_file,info.eip_fn_name);
		cprintf("\n");
		ebp=*((uint32_t *)ebp);
	}
	return 0;
}
Exemplo n.º 4
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	uint32_t ebp, eip;
	int i;

	cprintf("Stack backtrace:\n");

	ebp = read_ebp();
	while (ebp) {
		eip = ((uint32_t *) ebp)[1];
		cprintf("  ebp %08x eip %08x ", ebp, eip);
	
		cprintf("args ");
		for (i = 1; i <= 5; i++) {
			cprintf("%08x ", ((uint32_t *) ebp)[1 + i]);
		}
		cprintf("\n");

		struct Eipdebuginfo info;
		if (!debuginfo_eip(eip, &info))
			cprintf("\t%s:%d: %.*s+%d\n", info.eip_file, info.eip_line,
				info.eip_fn_namelen, info.eip_fn_name,
				eip - info.eip_fn_addr);

		ebp = ((uint32_t *) ebp)[0];
	}
	return 0;
}
Exemplo n.º 5
0
//  print the current backtrace of the thread.
void
backtrace(void)
{
    // hw1: fill in your code here.
    //cprintf("not implemented yet\n");

    extern void main(void);
    uint ebp, eip, up_ebp, retaddr;
    uint arg0, arg1, arg2, arg3, arg4;
    ebp = read_ebp();
    eip = (uint)backtrace;
    while(eip)
    {
        up_ebp = *(uint *)ebp;
        retaddr = *(uint *)(ebp + 4);
        arg0 = *(uint *)(ebp + 8);
        arg1 = *(uint *)(ebp + 12);
        arg2 = *(uint *)(ebp + 16);
        arg3 = *(uint *)(ebp + 20);
        arg4 = *(uint *)(ebp + 24);
        cprintf("ebp %x eip %x args %x %x %x %x %x\n", 
           ebp, eip, arg0, arg1, arg2, arg3, arg4);
        ebp = up_ebp;
        eip = retaddr;
    }
}
Exemplo n.º 6
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	uint32_t eip=read_eip();
	uint32_t ebp=read_ebp();
	uint32_t esp=ebp;
	int i;
	struct Eipdebuginfo info;
	cprintf("Stack backtrace:\n");
	// in Entry.S it sets ebp to 0 at first,so if ebp==0 then we know that there is no more stack.
	while(ebp!=0) {
		cprintf("ebp %08x  eip %08x  args  ",ebp,eip);
		// pop the saved ebp to current ebp.
		ebp=*(uint32_t *)esp;
		esp+=4;
		// pop the saved eip to current eip.
		eip=*(uint32_t *)esp;
		esp+=4;
		for(i=0;i<=4;i++){
			cprintf("%08x ",*(uint32_t *)esp);
			esp+=4;
		}
		cprintf("\n");
		cprintf("        ");
		debuginfo_eip(eip,&info);
		cprintf("%s:%d: ",info.eip_file, info.eip_line);
		cprintf("%.*s",info.eip_fn_namelen, info.eip_fn_name);
		cprintf("+%d", eip-info.eip_fn_addr);
		cprintf("\n");
		esp=ebp;
	}
	return 0;
}
Exemplo n.º 7
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	uint32_t *addr = 0;
	char format[FORMAT_LENGTH] = {0};
	char formatName[FORMAT_LENGTH] = { 0 };
	struct Eipdebuginfo info;
	strcpy(format,
		 " ebp %08x eip %08x args %08x %08x %08x %08x %08x");
	strcpy(formatName, "	%s:%d: %.*s+%d\n");
	addr = (uint32_t *)read_ebp();
	
	cprintf("Stack backtrace\n");
	for (; NULL != addr;) 
	{
		cprintf(format, EBP(addr), EIP(addr), ARG(addr, 0), 
			ARG(addr, 1), ARG(addr, 2), ARG(addr, 3), 
			ARG(addr, 4));
		debuginfo_eip(EIP(addr), &info);
		cprintf(formatName,
			info.eip_file,
			info.eip_line,
			info.eip_fn_namelen,
			info.eip_fn_name, EIP(addr)-info.eip_fn_addr);	
		addr = (uint32_t*)*addr;
	}
	return 0;
}
Exemplo n.º 8
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	cprintf("Stack backtrace:\n");
	uint32_t ebp = read_ebp();
	uint32_t eip; // = read_eip();
	struct Eipdebuginfo info;

	int idxStr;
	while (ebp != 0) {
		// print registers
		cprintf("  ebp %x", ebp);
		eip = *(uint32_t*)(ebp + 4);
		cprintf("  eip %x", eip);
		cprintf("  args %08x", *(uint32_t*)(ebp + 8));
		cprintf(" %08x", *(uint32_t*)(ebp + 12));
		cprintf(" %08x", *(uint32_t*)(ebp + 16));
		cprintf(" %08x", *(uint32_t*)(ebp + 20));
		cprintf(" %08x\n", *(uint32_t*)(ebp + 24));
		ebp = *(uint32_t*)ebp;
		
		// print line numbers
		debuginfo_eip((uintptr_t)eip, &info);
		cprintf("         %s", info.eip_file);
		cprintf(":%d: ", info.eip_line);
		for (idxStr = 0; idxStr < info.eip_fn_namelen; idxStr++)
			cprintf("%c", info.eip_fn_name[idxStr]);
		cprintf("+%d\n", eip - info.eip_fn_addr);
	}
	return 0;
}
Exemplo n.º 9
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{	struct Eipdebuginfo info;
	unsigned int *ebp=(unsigned int *)read_ebp();
	unsigned int *esp=(unsigned int *)read_esp();
	unsigned int *eip=0;
	unsigned int arg[5];
	int i=0;
	while(ebp)
	{		
			for(i=0;i<5;i++)
				arg[i]=*(ebp+i+2);
			eip=ebp+1;
			debuginfo_eip(*eip,&info);
			cprintf("  ebp %08x eip %08x args  ",(unsigned int)ebp,*eip );
			for(i=0;i<5;++i)
			cprintf("%08x  ", arg[i]);
			cprintf("\n");
			
			cprintf("\t\t%s:%u:%.*s+%u\n",
				info.eip_file,
				info.eip_line,
				info.eip_fn_namelen,
				info.eip_fn_name,
				*eip-info.eip_fn_addr);
			esp=ebp+2;
			ebp=(unsigned int *)*ebp;
	}
	return 0;
}
Exemplo n.º 10
0
// Acquire the lock.
// Loops (spins) until the lock is acquired.
// Holding a lock for a long time may cause
// other CPUs to waste time spinning to acquire it.
void
spinlock_acquire(struct spinlock *lk)
{
    if(spinlock_holding(lk))
        panic("Already holding lock.");
    while(xchg(&(lk->locked), 1) != 0)
        pause();
    lk->cpu = cpu_cur();
    debug_trace(read_ebp(), lk->eips);
}
Exemplo n.º 11
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	unsigned int *ebp = (unsigned int *)read_ebp();

	do
	{
		ebp = dump_stack(ebp);
	}while(ebp);

	return 0;
}
Exemplo n.º 12
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
  // Your code here.
  uint32_t *ebp = (uint32_t*)read_ebp();
    struct Eipdebuginfo info;
    cprintf ("Stack backtrace:\n");
    while (ebp != 0x0){
        cprintf (" ebp %08x eip %08x args %08x %08x %08x %08x %08x\n", ebp, ebp[1], ebp[2], ebp[3], ebp[4], ebp[5], ebp[6]);
        debuginfo_eip(ebp[1],&info);
        cprintf ("%s:%d: %.*s+%d\n", info.eip_file, info.eip_line, info.eip_fn_namelen,info.eip_fn_name, ebp[1]-info.eip_fn_addr);
	ebp = (uint32_t*) ebp[0];
    }
    return 0;
}
Exemplo n.º 13
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	uint32_t* ebp = (uint32_t*) read_ebp();
	cprintf("Stack backtrace:\n");
	while (ebp) {
		cprintf("ebp %x  eip %x  args", ebp, ebp[1]);
		int i;
		for (i = 2; i <= 6; ++i)
			cprintf(" %08.x", ebp[i]);
		cprintf("\n");
		ebp = (uint32_t*) *ebp;
	}
	return 0;
}
Exemplo n.º 14
0
// Record the current call stack in pcs[] by following the %ebp chain.
static void
get_caller_pcs(uint32_t pcs[])
{
	uint32_t *ebp;
	int i;

	ebp = (uint32_t *)read_ebp();
	for (i = 0; i < 10; i++){
		if (ebp == 0 || ebp < (uint32_t *)ULIM)
			break;
		pcs[i] = ebp[1];          // saved %eip
		ebp = (uint32_t *)ebp[0]; // saved %ebp
	}
	for (; i < 10; i++)
		pcs[i] = 0;
}
Exemplo n.º 15
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
    // Your code here.
    uint32_t* ebp = (uint32_t*) read_ebp();
    cprintf("Stack backtrace:\n");
    while (ebp != 0) {
        cprintf("  ebp %08x  eip %08x", ebp, *(ebp+1));
        cprintf("  args %08x %08x %08x %08x %08x\n", *(ebp+2), *(ebp+3), *(ebp+4), *(ebp+5), *(ebp+6));
        struct Eipdebuginfo info;
        debuginfo_eip(*(ebp+1), &info);
        cprintf("         %s:%d: %.*s+%d\n", info.eip_file, info.eip_line, info.eip_fn_namelen, 							 info.eip_fn_name, *(ebp + 1) - info.eip_fn_addr);
        ebp = (uint32_t*) *ebp;
    }
    return 0;
}
Exemplo n.º 16
0
int
cpu(void)
{
	// Cannot call cpu when interrupts are enabled:
	// result not guaranteed to last long enough to be used!
	// Would prefer to panic but even printing is chancy here:
	// everything, including cprintf, calls cpu, at least indirectly
	// through acquire and release.
	if(read_eflags()&FL_IF){
		static int n;
		if(n++ == 0)
			cprintf("cpu called from %x with interrupts enabled\n",
				((uint32_t*)read_ebp())[1]);
	}

	if(lapic)
		return lapic[ID]>>ID_SHIFT;
	return 0;
}
Exemplo n.º 17
0
Arquivo: monitor.c Projeto: Scenny/JOS
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	struct Eipdebuginfo info;
	int i = 1;
	uint32_t* ebp = (uint32_t*) read_ebp();
	uint32_t eip = *(ebp + 1); // return address
	cprintf("Stack backtrace:\n");
	for (; ebp != 0; ebp = (uint32_t*)(*(ebp)), eip = *(ebp + 1)) {
		cprintf("  ebp %08x  eip %08x  args", ebp, eip);
		for (i = 1; i <= 5; ++i) 
			cprintf(" %08x", *(ebp + 1 + i));
		cprintf("\n");
		debuginfo_eip((uintptr_t)(*(ebp + 1)), &info);
		cprintf("         %s:%d: %.*s+%u\n", info.eip_file, info.eip_line, info.eip_fn_namelen, info.eip_fn_name, (unsigned int)(*(ebp + 1) - info.eip_fn_addr));
	}
	return 0;
}
Exemplo n.º 18
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
        // 寄存器ebp 的值是当前栈帧的最高地址,而且这个最高地址对应的内存单元里面存放的值恰好是调用者栈帧的最高地址
        // 寄存器eip 存放的是cpu 执行下一条指令的地址
        uint32_t *ebp = (uint32_t *)read_ebp();
        struct Eipdebuginfo info;
        
        cprintf("Stack backtrace:\n");

        while (ebp) {
            
            cprintf("ebp %08x eip %08x args %08x %08x %08x %08x %08x\n", ebp, ebp[1], ebp[2], ebp[3], ebp[4], ebp[5], ebp[6]);
            uint32_t eip = ebp[1];
            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));

            ebp = (uint32_t *)(*ebp);
        }
        return 0;
}
Exemplo n.º 19
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
  // Your code here.
  int * ebp = (int *) read_ebp();
  uint32_t eip;
  uint32_t arg[5];
  struct Eipdebuginfo info;
  while (ebp != 0){
    eip = ebp[1];
    arg[0] = ebp[2];
    arg[1] = ebp[3];
    arg[2] = ebp[4];
    arg[3] = ebp[5];
    arg[4] = ebp[6];
    cprintf("ebp %08x eip %08x args %08x %08x %08x %08x %08x\n",ebp,eip,arg[0],arg[1],arg[2],arg[3],arg[4]);
    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);
    ebp= (int *) ebp[0];
  }
  return 0;
}
Exemplo n.º 20
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
    uint32_t ebp, eip, *p;
    struct Eipdebuginfo info;

    ebp = read_ebp();
    while (ebp != 0)
    {
        p = (uint32_t *) ebp;
        eip = p[1];
        cprintf("ebp %x eip %x args %08x %08x %08x %08x %08x\n", ebp, eip, p[2], p[3], p[4], p[5], p[6]);
        if (debuginfo_eip(eip, &info) == 0)
        {
            int fn_offset = eip - info.eip_fn_addr;

            cprintf("%s:%d: %.*s+%d\n", info.eip_file, info.eip_line, info.eip_fn_namelen, info.eip_fn_name, fn_offset);
        }
        ebp = p[0];
    }
    
	return 0;
}
Exemplo n.º 21
0
int
csa_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	uint32_t* ebp = (uint32_t*) read_ebp();
	cprintf("Stack backtrace:\n");
	while (ebp) {
		uint32_t eip = ebp[1];
		cprintf("ebp %x  eip %x  args", ebp, eip);
		int i;
		for (i = 2; i <= 6; ++i)
			cprintf(" %08.x", ebp[i]);
		cprintf("\n");
		struct Eipdebuginfo info;
		debuginfo_eip(eip, &info);
		cprintf("\t%s:%d: %.*s+%d\n", 
			info.eip_file, info.eip_line,
			info.eip_fn_namelen, info.eip_fn_name,
			eip-info.eip_fn_addr);
//         kern/monitor.c:143: monitor+106
		ebp = (uint32_t*) *ebp;
	}
	return 0;
}
Exemplo n.º 22
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	//The ebp value of the program, which calls the mon_backtrace
	int regebp = read_ebp();
	regebp = *((int *)regebp);
	int *ebp = (int *)regebp;
	
	cprintf("Stack backtrace:\n");
	//If only we haven't pass the stack frame of i386_init
	while((int)ebp != 0x0) {
		cprintf("  ebp %08x", (int)ebp);
		cprintf("  eip %08x", *(ebp+1));
		cprintf("  args");
		cprintf(" %08x", *(ebp+2));
		cprintf(" %08x", *(ebp+3));
		cprintf(" %08x", *(ebp+4));
		cprintf(" %08x", *(ebp+5));
		cprintf(" %08x\n", *(ebp+6));
		ebp = (int *)(*ebp);
	}
	return 0;
}
Exemplo n.º 23
0
//exception dispatcher
void _on_exception(int code, int codedata, CPUState *cpudata) {
  e9printf("_on_exception called.  code: %d, codedata: %d, cpudata: %p\n", code, codedata, cpudata);
  e9printf("  eax: %x, ebx: %x, edx: %x\n", read_eax(), read_ebx(), read_edx());
  e9printf("  ebp: %x, esp: %x, eip: %x\n\n", read_ebp(), read_esp(), get_eip());

  //sanitize code, just to be safe
  code = code & 31;
  
  int handled = 0;
  for (LinkNode *node=exception_stacks[code].first; node; node=node->next) {
    ExceptionHandler handler = node->data;
    
    if (handler(code, codedata, cpudata)) {
      handled = 1;
      break;
    }
  }
  
  if (!handled) {
    e9printf("Unhandled exception %d\n", code);
    kerror(-1, "Unhandled exception");
  }
}
Exemplo n.º 24
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	uint32_t * ebp;
	ebp = (uint32_t *)read_ebp();

	cprintf("Stack backtrace:\n");
	while(ebp != 0){
		cprintf("  ebp %08x  eip %08x  args %08x %08x %08x %08x %08x\n", 
			ebp, (uint32_t *)ebp[1], ebp[2], ebp[3], ebp[4] , ebp[5], ebp[6]);
		struct Eipdebuginfo  dinfo;
		debuginfo_eip((uintptr_t)(uint32_t *)ebp[1], &dinfo);
		char tmpname[30];
		strcpy(tmpname, dinfo.eip_fn_name);
		tmpname[dinfo.eip_fn_namelen] = '\0';
		cprintf("         %s:%d: %s+%u\n", dinfo.eip_file, dinfo.eip_line, tmpname, (uint32_t)ebp[1] - dinfo.eip_fn_addr);
		ebp = (uint32_t *)ebp[0];
		
	}
	return 0;

}
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
        uint32_t *ebp;
        uint32_t eip;
        uint32_t arg0, arg1, arg2, arg3, arg4;
        ebp = (uint32_t *)read_ebp();
        eip = ebp[1];
        arg0 = ebp[2];
        arg1 = ebp[3];
        arg2 = ebp[4];
        arg3 = ebp[5];
        arg4 = ebp[6];
        cprintf("Stack backtrace:\n");
        while(ebp != 0) {
             
             char fn[100];
              
             cprintf("  ebp  %08x  eip %08x  args %08x %08x %08x %08x %08x\n", 
                                       ebp, eip, arg0, arg1, arg2, arg3, arg4);
             struct Eipdebuginfo info;
             debuginfo_eip(eip, &info);
            
             snprintf(fn, info.eip_fn_namelen+1, "%s", info.eip_fn_name);
            
             cprintf("         %s:%u: %s+%u\n", info.eip_file, info.eip_line, fn, eip - info.eip_fn_addr);
             ebp = (uint32_t *)ebp[0];
             eip = ebp[1];
             arg0 = ebp[2];
             arg1 = ebp[3];
             arg2 = ebp[4];
             arg3 = ebp[5];
             arg4 = ebp[6];
        }
	return 0;
}
Exemplo n.º 26
0
void dump_stack(void)
{
    dump_stack_ptr(read_ebp());
}
Exemplo n.º 27
0
void Inspector::print_backtrace() {
  print_backtrace(read_ebp());
}