/* * Verify redzones. * This function is called on free() and realloc(). */ void redzone_check(caddr_t naddr) { struct stack ast, fst; caddr_t haddr, faddr; u_int ncorruptions; u_long nsize; int i; haddr = naddr - REDZONE_HSIZE; bcopy(haddr, &ast, sizeof(ast)); haddr += sizeof(ast); bcopy(haddr, &nsize, sizeof(nsize)); haddr += sizeof(nsize); atomic_subtract_long(&redzone_extra_mem, redzone_size_ntor(nsize) - nsize); /* Look for buffer underflow. */ ncorruptions = 0; for (i = 0; i < REDZONE_CHSIZE; i++, haddr++) { if (*(u_char *)haddr != 0x42) ncorruptions++; } if (ncorruptions > 0) { printf("REDZONE: Buffer underflow detected. %u byte%s " "corrupted before %p (%lu bytes allocated).\n", ncorruptions, ncorruptions == 1 ? "" : "s", naddr, nsize); printf("Allocation backtrace:\n"); stack_print_ddb(&ast); printf("Free backtrace:\n"); stack_save(&fst); stack_print_ddb(&fst); if (redzone_panic) panic("Stopping here."); } faddr = naddr + nsize; /* Look for buffer overflow. */ ncorruptions = 0; for (i = 0; i < REDZONE_CFSIZE; i++, faddr++) { if (*(u_char *)faddr != 0x42) ncorruptions++; } if (ncorruptions > 0) { printf("REDZONE: Buffer overflow detected. %u byte%s corrupted " "after %p (%lu bytes allocated).\n", ncorruptions, ncorruptions == 1 ? "" : "s", naddr + nsize, nsize); printf("Allocation backtrace:\n"); stack_print_ddb(&ast); printf("Free backtrace:\n"); stack_save(&fst); stack_print_ddb(&fst); if (redzone_panic) panic("Stopping here."); } }
void kdb_backtrace(void) { if (kdb_dbbe != NULL && kdb_dbbe->dbbe_trace != NULL) { printf("KDB: stack backtrace:\n"); kdb_dbbe->dbbe_trace(); } #ifdef STACK else { struct stack st; printf("KDB: stack backtrace:\n"); stack_save(&st); stack_print_ddb(&st); } #endif }
/* * Similar to kdb_backtrace() except that it prints a backtrace of an * arbitrary thread rather than the calling thread. */ void kdb_backtrace_thread(struct thread *td) { if (kdb_dbbe != NULL && kdb_dbbe->dbbe_trace_thread != NULL) { printf("KDB: stack backtrace of thread %d:\n", td->td_tid); kdb_dbbe->dbbe_trace_thread(td); } #ifdef STACK else { struct stack st; printf("KDB: stack backtrace of thread %d:\n", td->td_tid); stack_zero(&st); stack_save_td(&st, td); stack_print_ddb(&st); } #endif }