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; }
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, ")"); }