Make `trace' useful even w/o symbols and add /f option to dump parameters.
This commit is contained in:
parent
d5de074946
commit
cc5ddb2b20
@ -1,4 +1,4 @@
|
|||||||
/* $NetBSD: db_trace.c,v 1.7 2001/02/04 17:38:11 briggs Exp $ */
|
/* $NetBSD: db_trace.c,v 1.8 2001/03/29 14:58:08 eeh Exp $ */
|
||||||
/* $OpenBSD: db_trace.c,v 1.3 1997/03/21 02:10:48 niklas Exp $ */
|
/* $OpenBSD: db_trace.c,v 1.3 1997/03/21 02:10:48 niklas Exp $ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -97,6 +97,7 @@ db_stack_trace_print(addr, have_addr, count, modif, pr)
|
|||||||
char *symname;
|
char *symname;
|
||||||
boolean_t kernel_only = TRUE;
|
boolean_t kernel_only = TRUE;
|
||||||
boolean_t trace_thread = FALSE;
|
boolean_t trace_thread = FALSE;
|
||||||
|
boolean_t full = FALSE;
|
||||||
|
|
||||||
{
|
{
|
||||||
register char *cp = modif;
|
register char *cp = modif;
|
||||||
@ -107,11 +108,15 @@ db_stack_trace_print(addr, have_addr, count, modif, pr)
|
|||||||
trace_thread = TRUE;
|
trace_thread = TRUE;
|
||||||
if (c == 'u')
|
if (c == 'u')
|
||||||
kernel_only = FALSE;
|
kernel_only = FALSE;
|
||||||
|
if (c == 'f')
|
||||||
|
full = TRUE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
frame = (db_addr_t)ddb_regs.r[1];
|
frame = (db_addr_t)ddb_regs.r[1];
|
||||||
while ((frame = *(db_addr_t *)frame) && count--) {
|
while ((frame = *(db_addr_t *)frame) && count--) {
|
||||||
|
db_addr_t *args = (db_addr_t *)(frame + 8);
|
||||||
|
|
||||||
lr = *(db_addr_t *)(frame + 4) - 4;
|
lr = *(db_addr_t *)(frame + 4) - 4;
|
||||||
if (lr & 3) {
|
if (lr & 3) {
|
||||||
(*pr)("saved LR(0x%x) is invalid.", lr);
|
(*pr)("saved LR(0x%x) is invalid.", lr);
|
||||||
@ -120,12 +125,19 @@ db_stack_trace_print(addr, have_addr, count, modif, pr)
|
|||||||
if ((caller = (db_addr_t)vtophys(lr)) == 0)
|
if ((caller = (db_addr_t)vtophys(lr)) == 0)
|
||||||
caller = lr;
|
caller = lr;
|
||||||
|
|
||||||
|
if (full)
|
||||||
|
/* Print all the args stored in that stackframe. */
|
||||||
|
printf("(%lx, %lx, %lx, %lx, %lx, %lx, %lx, %lx) %lx ",
|
||||||
|
args[0], args[1], args[2], args[3],
|
||||||
|
args[4], args[5], args[6], args[7], frame);
|
||||||
|
|
||||||
diff = 0;
|
diff = 0;
|
||||||
symname = NULL;
|
symname = NULL;
|
||||||
sym = db_search_symbol(caller, DB_STGY_ANY, &diff);
|
sym = db_search_symbol(caller, DB_STGY_ANY, &diff);
|
||||||
db_symbol_values(sym, &symname, 0);
|
db_symbol_values(sym, &symname, 0);
|
||||||
if (symname == NULL)
|
if (symname == NULL)
|
||||||
symname = "?";
|
(*pr)("at %p\n", caller);
|
||||||
(*pr)("at %s+%x\n", symname, diff);
|
else
|
||||||
|
(*pr)("at %s+%x\n", symname, diff);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user