Unify db_stack_trace_cmd(). All it did was look up the thread given
the thread ID and call db_trace_thread(). Since arm has all the logic in db_stack_trace_cmd(), rename the new DB_COMMAND function to db_stack_trace to avoid conflicts on arm. While here, have db_stack_trace parse its own arguments so that we can use a more natural radix for IDs. If the ID is not a thread ID, or more precisely when no thread exists with the ID, try if there's a process with that ID and return the first thread in it. This makes it easier to print stack traces from the ps output. requested by: rwatson@ tested on: amd64, i386, ia64
This commit is contained in:
parent
06f84a9768
commit
dbb1edab27
@ -323,20 +323,6 @@ db_backtrace(struct thread *td, db_addr_t frame, db_addr_t pc, int count)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
|
||||
char *modif)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
td = (have_addr) ? kdb_thr_lookup(addr) : kdb_thread;
|
||||
if (td == NULL) {
|
||||
db_printf("Thread %d not found\n", (int)addr);
|
||||
return;
|
||||
}
|
||||
db_trace_thread(td, count);
|
||||
}
|
||||
|
||||
void
|
||||
db_trace_self(void)
|
||||
{
|
||||
|
@ -462,20 +462,6 @@ db_backtrace(struct thread *td, struct trapframe *tf,
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
|
||||
char *modif)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
td = (have_addr) ? kdb_thr_lookup(addr) : kdb_thread;
|
||||
if (td == NULL) {
|
||||
db_printf("Thread %ld not found\n", addr);
|
||||
return;
|
||||
}
|
||||
db_trace_thread(td, count);
|
||||
}
|
||||
|
||||
void
|
||||
db_trace_self(void)
|
||||
{
|
||||
|
@ -86,7 +86,7 @@ void db_md_list_watchpoints(void);
|
||||
#define FR_RSP (-2)
|
||||
#define FR_RFP (-3)
|
||||
|
||||
void
|
||||
static void
|
||||
db_stack_trace_cmd(addr, have_addr, count, modif)
|
||||
db_expr_t addr;
|
||||
int have_addr;
|
||||
@ -242,6 +242,7 @@ db_md_set_watchpoint(db_expr_t addr, db_expr_t size)
|
||||
{
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
db_trace_thread(struct thread *thr, int count)
|
||||
{
|
||||
|
@ -70,6 +70,7 @@ static db_cmdfcn_t db_fncall;
|
||||
static db_cmdfcn_t db_gdb;
|
||||
static db_cmdfcn_t db_kill;
|
||||
static db_cmdfcn_t db_reset;
|
||||
static db_cmdfcn_t db_stack_trace;
|
||||
static db_cmdfcn_t db_watchdog;
|
||||
|
||||
/* XXX this is actually forward-static. */
|
||||
@ -410,8 +411,8 @@ static struct command db_command_table[] = {
|
||||
{ "until", db_trace_until_call_cmd,0, 0 },
|
||||
{ "next", db_trace_until_matching_cmd,0, 0 },
|
||||
{ "match", db_trace_until_matching_cmd,0, 0 },
|
||||
{ "trace", db_stack_trace_cmd, 0, 0 },
|
||||
{ "where", db_stack_trace_cmd, 0, 0 },
|
||||
{ "trace", db_stack_trace, 0, 0 },
|
||||
{ "where", db_stack_trace, 0, 0 },
|
||||
{ "call", db_fncall, CS_OWN, 0 },
|
||||
{ "show", 0, 0, db_show_cmds },
|
||||
{ "ps", db_ps, 0, 0 },
|
||||
@ -623,3 +624,43 @@ db_gdb(db_expr_t dummy1, boolean_t dummy2, db_expr_t dummy3, char *dummy4)
|
||||
else
|
||||
db_printf("Step to enter the remote GDB backend.\n");
|
||||
}
|
||||
|
||||
static void
|
||||
db_stack_trace(db_expr_t tid, boolean_t hastid, db_expr_t count, char *modif)
|
||||
{
|
||||
struct thread *td;
|
||||
db_expr_t radix;
|
||||
int t;
|
||||
|
||||
/*
|
||||
* We parse our own arguments. We don't like the default radix.
|
||||
*/
|
||||
radix = db_radix;
|
||||
db_radix = 10;
|
||||
hastid = db_expression(&tid);
|
||||
t = db_read_token();
|
||||
if (t == tCOMMA) {
|
||||
if (!db_expression(&count)) {
|
||||
db_printf("Count missing\n");
|
||||
db_flush_lex();
|
||||
return;
|
||||
}
|
||||
} else {
|
||||
db_unread_token(t);
|
||||
count = -1;
|
||||
}
|
||||
db_skip_to_eol();
|
||||
db_radix = radix;
|
||||
|
||||
if (hastid) {
|
||||
td = kdb_thr_lookup((lwpid_t)tid);
|
||||
if (td == NULL)
|
||||
td = kdb_thr_from_pid((pid_t)tid);
|
||||
if (td == NULL) {
|
||||
db_printf("Thread %d not found\n", (int)tid);
|
||||
return;
|
||||
}
|
||||
} else
|
||||
td = kdb_thread;
|
||||
db_trace_thread(td, count);
|
||||
}
|
||||
|
@ -128,7 +128,6 @@ db_cmdfcn_t db_set_thread;
|
||||
db_cmdfcn_t db_show_regs;
|
||||
db_cmdfcn_t db_show_threads;
|
||||
db_cmdfcn_t db_single_step_cmd;
|
||||
db_cmdfcn_t db_stack_trace_cmd;
|
||||
db_cmdfcn_t db_trace_until_call_cmd;
|
||||
db_cmdfcn_t db_trace_until_matching_cmd;
|
||||
db_cmdfcn_t db_watchpoint_cmd;
|
||||
|
@ -448,20 +448,6 @@ db_backtrace(struct thread *td, struct trapframe *tf, struct i386_frame *frame,
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
|
||||
char *modif)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
td = (have_addr) ? kdb_thr_lookup(addr) : kdb_thread;
|
||||
if (td == NULL) {
|
||||
db_printf("Thread %d not found\n", addr);
|
||||
return;
|
||||
}
|
||||
db_trace_thread(td, count);
|
||||
}
|
||||
|
||||
void
|
||||
db_trace_self(void)
|
||||
{
|
||||
|
@ -124,20 +124,6 @@ db_backtrace(struct thread *td, struct pcb *pcb, int count)
|
||||
return (error);
|
||||
}
|
||||
|
||||
void
|
||||
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
|
||||
char *modif)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
td = (have_addr) ? kdb_thr_lookup(addr) : kdb_thread;
|
||||
if (td == NULL) {
|
||||
db_printf("Thread %d not found\n", (int)addr);
|
||||
return;
|
||||
}
|
||||
db_trace_thread(td, count);
|
||||
}
|
||||
|
||||
void
|
||||
db_trace_self(void)
|
||||
{
|
||||
|
@ -266,20 +266,6 @@ db_backtrace(struct thread *td, db_addr_t fp, int count)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
|
||||
char *modif)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
td = (have_addr) ? kdb_thr_lookup(addr) : kdb_thread;
|
||||
if (td == NULL) {
|
||||
db_printf("Thread %d not found\n", (int)addr);
|
||||
return;
|
||||
}
|
||||
db_trace_thread(td, count);
|
||||
}
|
||||
|
||||
void
|
||||
db_trace_self(void)
|
||||
{
|
||||
|
@ -271,20 +271,6 @@ db_backtrace(struct thread *td, struct frame *fp, int count)
|
||||
return (0);
|
||||
}
|
||||
|
||||
void
|
||||
db_stack_trace_cmd(db_expr_t addr, boolean_t have_addr, db_expr_t count,
|
||||
char *modif)
|
||||
{
|
||||
struct thread *td;
|
||||
|
||||
td = (have_addr) ? kdb_thr_lookup(addr) : kdb_thread;
|
||||
if (td == NULL) {
|
||||
db_printf("Thread %d not found\n", (int)addr);
|
||||
return;
|
||||
}
|
||||
db_trace_thread(td, count);
|
||||
}
|
||||
|
||||
void
|
||||
db_trace_self(void)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user