Beispiel #1
0
int
mon_backtrace(int argc, char **argv, struct Trapframe *tf)
{
	// Your code here.
	uint64_t rbp = 0x0;
	uint64_t rip = 0x0;
	uint64_t* prbp = NULL;

	struct Ripdebuginfo info;

	cprintf("Stack backtrace:\n");
	rbp = read_rbp();
	read_rip(rip);
	if(rbp == 0x0 || rip == 0x0)
	{
		cprintf("Not able to show backtrace");
		return -1;
	}
	prbp = (uint64_t*)(rbp);

	cprintf("    rbp %016x  rip %016x\n", prbp, rip);
	debuginfo_rip(rip ,&info);
	
	cprintf("        %s:%d: ",info.rip_file, info.rip_line);
	cprintf("%.*s+%016x",info.rip_fn_namelen, info.rip_fn_name, (rip - info.rip_fn_addr));
	cprintf(" args:%d", info.rip_fn_narg);
	printArgList(prbp, &info);

	while(prbp && *(prbp) != 0x0 && *(prbp+1) != 0x0)
	{
		cprintf("    rbp %016x  rip %016x\n",*(prbp),*((prbp) +1));
		debuginfo_rip(*(prbp+1) ,&info);

		cprintf("        %s:%d: ",info.rip_file, info.rip_line);
		cprintf("%.*s+%016x",info.rip_fn_namelen, info.rip_fn_name, (rip - info.rip_fn_addr));
		cprintf(" args:%d", info.rip_fn_narg);
		printArgList((uint64_t*)(*(prbp)), &info);
		
		prbp = (uint64_t*)(*(prbp)); 
	}
	return 0;
}
Beispiel #2
0
void printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext) {
    printVarType(f, &api->ret);
    fprintf(f, " %s%s (", prefix, api->name);
    if (addContext) {
        fprintf(f, "Context *");
    } else {
        fprintf(f, "RsContext rsc");
    }
    printArgList(f, api, 1);
    fprintf(f, ")");
}
void printFuncDecl(FILE *f, const ApiEntry *api, const char *prefix, int addContext, int isFnPtr) {
    printVarTypeAndName(f, &api->ret);
    if (isFnPtr) {
        char t[1024];
        strcpy(t, api->name);
        if (strlen(prefix) == 0) {
            if (t[0] > 'A' && t[0] < 'Z') {
                t[0] -= 'A' - 'a';
            }
        }
        fprintf(f, " (* %s%s) (", prefix, api->name);
    } else {
        fprintf(f, " %s%s (", prefix, api->name);
    }
    if (!api->nocontext) {
        if (addContext) {
            fprintf(f, "Context *");
        } else {
            fprintf(f, "RsContext rsc");
        }
    }
    printArgList(f, api, !api->nocontext);
    fprintf(f, ")");
}