* Format stack into sbuf from live kernel. * * flags - M_WAITOK or M_NOWAIT (EWOULDBLOCK). */
| 170 | * flags - M_WAITOK or M_NOWAIT (EWOULDBLOCK). |
| 171 | */ |
| 172 | int |
| 173 | stack_sbuf_print_flags(struct sbuf *sb, const struct stack *st, int flags, |
| 174 | enum stack_sbuf_fmt format) |
| 175 | { |
| 176 | char namebuf[64]; |
| 177 | long offset; |
| 178 | int i, error; |
| 179 | |
| 180 | KASSERT(st->depth <= STACK_MAX, ("bogus stack")); |
| 181 | for (i = 0; i < st->depth; i++) { |
| 182 | error = stack_symbol(st->pcs[i], namebuf, sizeof(namebuf), |
| 183 | &offset, flags); |
| 184 | if (error == EWOULDBLOCK) |
| 185 | return (error); |
| 186 | switch (format) { |
| 187 | case STACK_SBUF_FMT_LONG: |
| 188 | sbuf_printf(sb, "#%d %p at %s+%#lx\n", i, |
| 189 | (void *)st->pcs[i], namebuf, offset); |
| 190 | break; |
| 191 | case STACK_SBUF_FMT_COMPACT: |
| 192 | sbuf_printf(sb, "%s+%#lx ", namebuf, offset); |
| 193 | break; |
| 194 | default: |
| 195 | __assert_unreachable(); |
| 196 | } |
| 197 | } |
| 198 | sbuf_nl_terminate(sb); |
| 199 | return (0); |
| 200 | } |
| 201 | |
| 202 | void |
| 203 | stack_sbuf_print(struct sbuf *sb, const struct stack *st) |
no test coverage detected