/* * db_panic: Called by panic(). May print a stack trace; may enter the * kernel debugger; may just return so that panic() will continue to * halt or reboot the system. */ void db_panic(void) { if (db_onpanic == 1) Debugger(); else if (db_onpanic >= 0) { static int intrace = 0; if (intrace == 0) { intrace = 1; printf("cpu%u: Begin traceback...\n", cpu_index(curcpu())); db_stack_trace_print( (db_expr_t)(intptr_t)__builtin_frame_address(0), true, 65535, "", printf); printf("cpu%u: End traceback...\n", cpu_index(curcpu())); intrace = 0; } else printf("Faulted in mid-traceback; aborting..."); if (db_onpanic == 2) Debugger(); } return; }
void db_stack_dump(void) { static int intrace; if (intrace) { printf("Faulted in traceback, aborting...\n"); return; } intrace = 1; printf("Starting stack trace...\n"); db_stack_trace_print((db_expr_t)__builtin_frame_address(0), TRUE, 256 /* low limit */, "", printf); printf("End of stack trace.\n"); intrace = 0; }
void db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count, char *modif) { db_stack_trace_print(addr, have_addr, count, modif, db_printf); }