diff options
author | jeff <jeff@FreeBSD.org> | 2005-08-03 04:27:40 +0000 |
---|---|---|
committer | jeff <jeff@FreeBSD.org> | 2005-08-03 04:27:40 +0000 |
commit | 4a761caec7754f1fc2754466099320c54bf45abb (patch) | |
tree | 52986abea99ce3e4955fd106535de6f4e591bac2 /sys/sparc64 | |
parent | 24f85b0b69c29af04dc033d110270b9a40a1bcaa (diff) | |
download | FreeBSD-src-4a761caec7754f1fc2754466099320c54bf45abb.zip FreeBSD-src-4a761caec7754f1fc2754466099320c54bf45abb.tar.gz |
- Add support for saving stack traces and displaying them via printf(9)
and KTR.
Contributed by: Antoine Brodin <antoine.brodin@laposte.net>
Concept code from: Neal Fachan <neal@isilon.com>
Diffstat (limited to 'sys/sparc64')
-rw-r--r-- | sys/sparc64/sparc64/db_trace.c | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/sys/sparc64/sparc64/db_trace.c b/sys/sparc64/sparc64/db_trace.c index dc6e4bb..66cc76b 100644 --- a/sys/sparc64/sparc64/db_trace.c +++ b/sys/sparc64/sparc64/db_trace.c @@ -31,6 +31,7 @@ #include <sys/kdb.h> #include <sys/linker_set.h> #include <sys/proc.h> +#include <sys/stack.h> #include <sys/sysent.h> #include <vm/vm.h> @@ -291,3 +292,23 @@ db_trace_thread(struct thread *td, int count) ctx = kdb_thr_ctx(td); return (db_backtrace(td, (struct frame*)(ctx->pcb_sp + SPOFF), count)); } + +void +stack_save(struct stack *st) +{ + struct frame *fp; + db_expr_t addr; + vm_offset_t callpc; + + stack_zero(st); + addr = (db_expr_t)__builtin_frame_address(1); + fp = (struct frame *)(addr + SPOFF); + while (1) { + callpc = fp->fr_pc; + if (!INKERNEL(callpc)) + break; + if (stack_put(st, callpc) == -1) + break; + fp = (struct frame *)(fp->fr_fp + SPOFF); + } +} |