ddb: Enable 'thread <address>'

Currently, the 'thread' command (to switch the debugger to another thread)
only accepts decimal-encoded tids.  Use the same parsing logic as 'show
thread <arg>' to accept hex-encoded thread pointers in addition to
decimal-encoded tids.

Document the 'thread' command in ddb.4 and expand the 'show thread'
documentation to cover the tid usage.

Reported by:	bwidawsk
Reviewed by:	bwidawsk (earlier version), kib (earlier version), markj
Sponsored by:	Dell EMC Isilon
Differential Revision:	https://reviews.freebsd.org/D16962
This commit is contained in:
Conrad Meyer 2018-10-20 20:45:49 +00:00
parent 64aa915f8a
commit e41793db2c
3 changed files with 18 additions and 17 deletions

View File

@ -60,7 +60,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd September 7, 2018
.Dd September 21, 2018
.Dt DDB 4
.Os
.Sh NAME
@ -1013,13 +1013,17 @@ For exact interpretation of output, visit
header file.
.\"
.Pp
.It Ic show Cm thread Op Ar addr
.It Ic show Cm thread Op Ar addr | tid
If no
.Ar addr
or
.Ar tid
is specified, show detailed information about current thread.
Otherwise, information about thread at
.Ar addr
is printed.
Otherwise, print information about the thread with ID
.Ar tid
or kernel address
.Ar addr .
(If the argument is a decimal number, it is assumed to be a tid.)
.\"
.Pp
.It Ic show Cm threads
@ -1249,6 +1253,13 @@ rather than a traditional memory dump or minidump.
reports whether a textdump has been scheduled.
.Ic textdump unset
cancels a request to perform a textdump as the next kernel core dump.
.Pp
.It Ic thread Ar addr | tid
Switch the debugger to the thread with ID
.Ar tid ,
if the argument is a decimal number, or address
.Ar addr ,
otherwise.
.El
.Sh VARIABLES
The debugger accesses registers and variables as

View File

@ -145,7 +145,7 @@ static struct command db_cmds[] = {
{ "reset", db_reset, 0, NULL },
{ "kill", db_kill, CS_OWN, NULL },
{ "watchdog", db_watchdog, CS_OWN, NULL },
{ "thread", db_set_thread, CS_OWN, NULL },
{ "thread", db_set_thread, 0, NULL },
{ "run", db_run_cmd, CS_OWN, NULL },
{ "script", db_script_cmd, CS_OWN, NULL },
{ "scripts", db_scripts_cmd, 0, NULL },

View File

@ -55,20 +55,10 @@ void
db_set_thread(db_expr_t tid, bool hastid, db_expr_t cnt, char *mod)
{
struct thread *thr;
db_expr_t radix;
int err;
/*
* We parse our own arguments. We don't like the default radix.
*/
radix = db_radix;
db_radix = 10;
hastid = db_expression(&tid);
db_radix = radix;
db_skip_to_eol();
if (hastid) {
thr = kdb_thr_lookup(tid);
thr = db_lookup_thread(tid, false);
if (thr != NULL) {
err = kdb_thr_select(thr);
if (err != 0) {