> Playing with MDB ::ps dcmd I noticed that the status field interpretation is > different from the regular ps(1) command. The status in MDB is the value of > pr.p_stat field which, according to the code may only have values SRUN, SIDL > and SZOMB. The code in MDB pretends to understand other states: > > static char > pstat2ch(uchar_t state) > { > switch (state) { > case SSLEEP: return ('S'); > case SRUN: return ('R'); > case SZOMB: return ('Z'); > case SIDL: return ('I'); > case SONPROC: return ('O'); > case SSTOP: return ('T'); > default: return ('?'); > } > } > > The ps(1) and prstat(1M) get process state from psinfo_t pr_sname field which > is based on thread state for the representative lwp and which may be > different > from p_stat field. > > The MDB implementation is quite simple since it just reads p_stat field from > the process structure and doesn't need to simulate any translations done by > /proc. > > The question, though is whether such discrepancy is by design or by accident? > > - Alex Kolbasov
pr_sname can't be computed normally by mdb, since the notion of selecting a representative LWP according to proc(4) rules is impossible from a dump or live kernel image. So I just printed p_stat. The only other real possible choice is ? for everything except zombies, leaving users to go and query individual LWPs (::thread) if they want to see what is going on. -Mike -- Mike Shapiro, Solaris Kernel Development. blogs.sun.com/mws/