Changeset View
Changeset View
Standalone View
Standalone View
sys/ddb/db_command.c
Show First 20 Lines • Show All 687 Lines • ▼ Show 20 Lines | #define DB_ERROR(f) do { db_printf f; db_flush_lex(); goto out; } while (0) | ||||
db_skip_to_eol(); | db_skip_to_eol(); | ||||
if (!_SIG_VALID(sig)) | if (!_SIG_VALID(sig)) | ||||
DB_ERROR(("Signal number out of range\n")); | DB_ERROR(("Signal number out of range\n")); | ||||
/* | /* | ||||
* Find the process in question. allproc_lock is not needed | * Find the process in question. allproc_lock is not needed | ||||
* since we're in DDB. | * since we're in DDB. | ||||
*/ | */ | ||||
/* sx_slock(&allproc_lock); */ | /* Operate on current vps instance only. */ | ||||
/* sx_slock(&V_allproc_lock); */ | |||||
FOREACH_PROC_IN_SYSTEM(p) | FOREACH_PROC_IN_SYSTEM(p) | ||||
if (p->p_pid == pid) | if (p->p_pid == pid) | ||||
break; | break; | ||||
/* sx_sunlock(&allproc_lock); */ | /* sx_sunlock(&V_allproc_lock); */ | ||||
if (p == NULL) | if (p == NULL) | ||||
DB_ERROR(("Can't find process with pid %ld\n", (long) pid)); | DB_ERROR(("Can't find process with pid %ld\n", (long) pid)); | ||||
/* If it's already locked, bail; otherwise, do the deed. */ | /* If it's already locked, bail; otherwise, do the deed. */ | ||||
if (PROC_TRYLOCK(p) == 0) | if (PROC_TRYLOCK(p) == 0) | ||||
DB_ERROR(("Can't lock process with pid %ld\n", (long) pid)); | DB_ERROR(("Can't lock process with pid %ld\n", (long) pid)); | ||||
else { | else { | ||||
pksignal(p, sig, NULL); | pksignal(p, sig, NULL); | ||||
▲ Show 20 Lines • Show All 162 Lines • ▼ Show 20 Lines | if (setjmp(jb) == 0) { | ||||
} | } | ||||
} | } | ||||
} | } | ||||
kdb_jmpbuf(prev_jb); | kdb_jmpbuf(prev_jb); | ||||
} | } | ||||
} | } | ||||
static void | static void | ||||
_db_stack_trace_all_v(bool active_only) | |||||
{ | |||||
VPS_ITERATOR_DECL(vps_iter); | |||||
/* VPS_LIST_RLOCK(); */ | |||||
VPS_FOREACH(vps_iter) { | |||||
CURVPS_SET(vps_iter); | |||||
_db_stack_trace_all(active_only); | |||||
CURVPS_RESTORE(); | |||||
} | |||||
/* VPS_LIST_RUNLOCK(); */ | |||||
} | |||||
static void | |||||
db_stack_trace_active(db_expr_t dummy, bool dummy2, db_expr_t dummy3, | db_stack_trace_active(db_expr_t dummy, bool dummy2, db_expr_t dummy3, | ||||
char *dummy4) | char *dummy4) | ||||
{ | { | ||||
_db_stack_trace_all(true); | _db_stack_trace_all_v(true); | ||||
} | } | ||||
static void | static void | ||||
db_stack_trace_all(db_expr_t dummy, bool dummy2, db_expr_t dummy3, | db_stack_trace_all(db_expr_t dummy, bool dummy2, db_expr_t dummy3, | ||||
char *dummy4) | char *dummy4) | ||||
{ | { | ||||
_db_stack_trace_all(false); | _db_stack_trace_all_v(false); | ||||
} | } | ||||
/* | /* | ||||
* Take the parsed expression value from the command line that was parsed | * Take the parsed expression value from the command line that was parsed | ||||
* as a hexadecimal value and convert it as if the expression was parsed | * as a hexadecimal value and convert it as if the expression was parsed | ||||
* as a decimal value. Returns -1 if the expression was not a valid | * as a decimal value. Returns -1 if the expression was not a valid | ||||
* decimal value. | * decimal value. | ||||
*/ | */ | ||||
Show All 18 Lines |