static void pan_backtrace(void) { void *array[10]; size_t size; size_t i; size = backtrace (array, 10); if (size == 0) return; VSB_printf(pan_vsp, "Backtrace:\n"); for (i = 0; i < size; i++) { VSB_printf (pan_vsp, " "); if (Symbol_Lookup(pan_vsp, array[i]) < 0) { char **strings; strings = backtrace_symbols(&array[i], 1); if (strings != NULL && strings[0] != NULL) VSB_printf(pan_vsp, "%p: %s", array[i], strings[0]); else VSB_printf(pan_vsp, "%p: (?)", array[i]); } VSB_printf (pan_vsp, "\n"); } }
static void pan_backtrace(struct vsb *vsb) { void *array[10]; size_t size; size_t i; char **strings; char *p; size = backtrace (array, 10); if (size == 0) return; VSB_printf(vsb, "Backtrace:\n"); VSB_indent(vsb, 2); for (i = 0; i < size; i++) { if (Symbol_Lookup(vsb, array[i]) < 0) { strings = backtrace_symbols(&array[i], 1); if (strings == NULL || strings[0] == NULL) { VSB_printf(vsb, "%p: (?)", array[i]); } else { p = strrchr(strings[0], '/'); if (p == NULL) p = strings[0]; else p++; VSB_printf(vsb, "%p: %s", array[i], p); } } VSB_printf (vsb, "\n"); } VSB_indent(vsb, -2); }