Index: sys/ddb/db_ps.c =================================================================== --- sys/ddb/db_ps.c +++ sys/ddb/db_ps.c @@ -107,7 +107,7 @@ db_ps(db_expr_t addr, bool hasaddr, db_expr_t count, char *modif) { struct proc *p; - int i, j; + int i; ps_mode = modif[0] == 'a' ? PRINT_ARGS : PRINT_NONE; @@ -125,14 +125,12 @@ db_ps_proc(p); /* - * Do zombies. + * Processes such as zombies not in allproc. */ - for (i = 0; i < pidhashlock + 1 && !db_pager_quit; i++) { - for (j = i; j <= pidhash && !db_pager_quit; j += pidhashlock + 1) { - LIST_FOREACH(p, &pidhashtbl[j], p_hash) { - if (p->p_state == PRS_ZOMBIE) - db_ps_proc(p); - } + for (i = 0; i <= pidhash && !db_pager_quit; i++) { + LIST_FOREACH(p, &pidhashtbl[i], p_hash) { + if (p->p_list.le_prev == NULL) + db_ps_proc(p); } } } Index: sys/kern/kern_exit.c =================================================================== --- sys/kern/kern_exit.c +++ sys/kern/kern_exit.c @@ -39,6 +39,7 @@ #include __FBSDID("$FreeBSD$"); +#include "opt_ddb.h" #include "opt_ktrace.h" #include @@ -436,6 +437,14 @@ */ sx_xlock(&allproc_lock); LIST_REMOVE(p, p_list); + +#ifdef DDB + /* + * Used by ddb's 'ps' command to find this process via the + * pidhash. + */ + p->p_list.le_prev = NULL; +#endif sx_xunlock(&allproc_lock); sx_xlock(&proctree_lock);