Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/subr_stack.c
Show First 20 Lines • Show All 164 Lines • ▼ Show 20 Lines | |||||
#endif | #endif | ||||
/* | /* | ||||
* Format stack into sbuf from live kernel. | * Format stack into sbuf from live kernel. | ||||
* | * | ||||
* flags - M_WAITOK or M_NOWAIT (EWOULDBLOCK). | * flags - M_WAITOK or M_NOWAIT (EWOULDBLOCK). | ||||
*/ | */ | ||||
int | int | ||||
stack_sbuf_print_flags(struct sbuf *sb, const struct stack *st, int flags) | stack_sbuf_print_flags(struct sbuf *sb, const struct stack *st, int flags, | ||||
enum stack_sbuf_fmt format) | |||||
{ | { | ||||
char namebuf[64]; | char namebuf[64]; | ||||
long offset; | long offset; | ||||
int i, error; | int i, error; | ||||
KASSERT(st->depth <= STACK_MAX, ("bogus stack")); | KASSERT(st->depth <= STACK_MAX, ("bogus stack")); | ||||
for (i = 0; i < st->depth; i++) { | for (i = 0; i < st->depth; i++) { | ||||
error = stack_symbol(st->pcs[i], namebuf, sizeof(namebuf), | error = stack_symbol(st->pcs[i], namebuf, sizeof(namebuf), | ||||
&offset, flags); | &offset, flags); | ||||
if (error == EWOULDBLOCK) | if (error == EWOULDBLOCK) | ||||
return (error); | return (error); | ||||
sbuf_printf(sb, "#%d %p at %s+%#lx\n", i, (void *)st->pcs[i], | switch (format) { | ||||
namebuf, offset); | case STACK_SBUF_FMT_LONG: | ||||
sbuf_printf(sb, "#%d %p at %s+%#lx\n", i, | |||||
(void *)st->pcs[i], namebuf, offset); | |||||
break; | |||||
case STACK_SBUF_FMT_COMPACT: | |||||
sbuf_printf(sb, "%s+%#lx ", namebuf, offset); | |||||
break; | |||||
default: | |||||
__assert_unreachable(); | |||||
} | } | ||||
} | |||||
sbuf_nl_terminate(sb); | |||||
return (0); | return (0); | ||||
} | } | ||||
void | void | ||||
stack_sbuf_print(struct sbuf *sb, const struct stack *st) | stack_sbuf_print(struct sbuf *sb, const struct stack *st) | ||||
{ | { | ||||
(void)stack_sbuf_print_flags(sb, st, M_WAITOK); | (void)stack_sbuf_print_flags(sb, st, M_WAITOK, STACK_SBUF_FMT_LONG); | ||||
} | } | ||||
#if defined(DDB) || defined(WITNESS) | #if defined(DDB) || defined(WITNESS) | ||||
void | void | ||||
stack_sbuf_print_ddb(struct sbuf *sb, const struct stack *st) | stack_sbuf_print_ddb(struct sbuf *sb, const struct stack *st) | ||||
{ | { | ||||
const char *name; | const char *name; | ||||
long offset; | long offset; | ||||
▲ Show 20 Lines • Show All 74 Lines • Show Last 20 Lines |