35#include <sys/kernel.h>
39#include <sys/linker.h>
40#include <sys/malloc.h>
44#include <sys/sysctl.h>
46FEATURE(stack,
"Support for capturing kernel stack");
50static int stack_symbol(vm_offset_t pc,
char *namebuf, u_int buflen,
51 long *offset,
int flags);
74 if (
st->depth < STACK_MAX) {
75 st->pcs[
st->depth++] = pc;
92 bzero(
st,
sizeof *
st);
102 KASSERT(
st->depth <= STACK_MAX, (
"bogus stack"));
103 for (i = 0; i <
st->depth; i++) {
106 printf(
"#%d %p at %s+%#lx\n", i, (
void *)
st->pcs[i],
118 KASSERT(
st->depth <= STACK_MAX, (
"bogus stack"));
119 for (i = 0; i <
st->depth; i++) {
123 &offset, M_WAITOK) == 0)
124 printf(
"%s+%#lx", namebuf, offset);
138 KASSERT(
st->depth <= STACK_MAX, (
"bogus stack"));
139 for (i = 0; i <
st->depth; i++) {
141 printf(
"#%d %p at %s+%#lx\n", i, (
void *)
st->pcs[i],
146#if defined(DDB) || defined(WITNESS)
148stack_print_short_ddb(
const struct stack *
st)
154 KASSERT(
st->depth <= STACK_MAX, (
"bogus stack"));
155 for (i = 0; i <
st->depth; i++) {
174 enum stack_sbuf_fmt format)
180 KASSERT(
st->depth <= STACK_MAX, (
"bogus stack"));
181 for (i = 0; i <
st->depth; i++) {
184 if (error == EWOULDBLOCK)
187 case STACK_SBUF_FMT_LONG:
189 (
void *)
st->pcs[i], namebuf, offset);
191 case STACK_SBUF_FMT_COMPACT:
195 __assert_unreachable();
209#if defined(DDB) || defined(WITNESS)
211stack_sbuf_print_ddb(
struct sbuf *sb,
const struct stack *
st)
217 KASSERT(
st->depth <= STACK_MAX, (
"bogus stack"));
218 for (i = 0; i <
st->depth; i++) {
220 sbuf_printf(sb,
"#%d %p at %s+%#lx\n", i, (
void *)
st->pcs[i],
228stack_ktr(u_int
mask,
const char *file,
int line,
const struct stack *
st,
237 KASSERT(
st->depth <= STACK_MAX, (
"bogus stack"));
239 if (depth == 0 ||
st->depth < depth)
241 for (i = 0; i < depth; i++) {
244 i,
st->pcs[i], (u_long)
name, offset, 0, 0);
262 if (error == 0 || error == EWOULDBLOCK)
266 strlcpy(namebuf,
"??", buflen);
273 linker_symval_t symval;
280 if (symval.name != NULL) {
static struct bt_table st
void ktr_tracepoint(uint64_t mask, const char *file, int line, const char *format, u_long arg1, u_long arg2, u_long arg3, u_long arg4, u_long arg5, u_long arg6)
int linker_ddb_search_symbol(caddr_t value, c_linker_sym_t *sym, long *diffp)
int linker_ddb_symbol_values(c_linker_sym_t sym, linker_symval_t *symval)
int linker_search_symbol_name_flags(caddr_t value, char *buf, u_int buflen, long *offset, int flags)
void *() malloc(size_t size, struct malloc_type *mtp, int flags)
void free(void *addr, struct malloc_type *mtp)
struct intr_irqsrc ** src
int printf(const char *fmt,...)
int sbuf_printf(struct sbuf *s, const char *fmt,...)
int sbuf_nl_terminate(struct sbuf *s)
int stack_sbuf_print_flags(struct sbuf *sb, const struct stack *st, int flags, enum stack_sbuf_fmt format)
void stack_zero(struct stack *st)
void stack_print_short(const struct stack *st)
MALLOC_DEFINE(M_STACK, "stack", "Stack Traces")
void stack_destroy(struct stack *st)
struct stack * stack_create(int flags)
int stack_put(struct stack *st, vm_offset_t pc)
void stack_print(const struct stack *st)
static int stack_symbol(vm_offset_t pc, char *namebuf, u_int buflen, long *offset, int flags)
static int stack_symbol_ddb(vm_offset_t pc, const char **name, long *offset)
void stack_print_ddb(const struct stack *st)
FEATURE(stack, "Support for capturing kernel stack")
void stack_copy(const struct stack *src, struct stack *dst)
void stack_sbuf_print(struct sbuf *sb, const struct stack *st)