Hi all, FYI, I just sent the following heads-up to onnv regarding a new DCMD in Solaris Nevada:
--- cut here --- With my putback of: 6799290 need to uniquify stacks in kmdb There is a new dcmd, ::stacks, in the genunix dmod. If (like me) you find yourself doing: > ::walk thread | ::findstack !/home/.../bin/munges 205 ################################## tp: ffffff0003e11c60 swtch+0x200() cv_wait+0x75() taskq_thread+0x11c() thread_start+8() ... reflexively, you'll be happy to know that that's now much shorter (and faster, especially if the home-directory is offline): > ::stacks THREAD STATE SOBJ COUNT ffffff0003e11c60 SLEEP CV 205 swtch+0x200 cv_wait+0x75 taskq_thread+0x11c thread_start+8 ffffff0154567aa0 SLEEP CV 62 swtch+0x200 cv_wait_sig_swap_core+0x170 cv_wait_sig_swap+0x18 cv_waituntil_sig+0x135 poll_common+0x4b5 pollsys+0xe4 sys_syscall32+0x1fc [ ... elided ... ] fffffffffbc3ae20 STOPPED <NONE> 1 swtch+0x200 sched+0x44f main+0x486 ffffff016bf7de20 STOPPED <NONE> 1 swtch+0x200 stop+0x84c isjobstop+0xc4 issig_forreal+0x4dc issig+0x24 cv_wait_sig_swap_core+0x206 cv_wait_sig_swap+0x18 waitid+0x2a0 waitsys32+0x30 sys_syscall32+0x1fc > It also has the advantage of working in KMDB. I hope you find it useful; the help text follows. Cheers, - jonathan > ::help stacks NAME stacks - print unique kernel thread stacks SYNOPSIS [ addr ] ::stacks [-afilv] [-c func] [-C func] [-s sobj | -S sobj] [-t tstate | -T tstate] DESCRIPTION ::stacks processes all of the thread stacks on the system, grouping together threads which have the same: * Thread state, * Sync object type, and * PCs in their stack trace. The default output (no address or options) is just a dump of the thread groups in the system. For a view of active threads, use "::stacks -i", which filters out FREE threads (interrupt threads which are currently inactive) and threads sleeping on a CV. (Note that those threads may still be of note; this is just for a first glance.) More general filtering options are described below, in the "FILTERS" section. ::stacks can be used in a pipeline. The input to ::stacks is one or more thread pointers. For example, to get a summary of threads in a process, you can do: procp::walk thread | ::stacks When output into a pipe, ::stacks prints all of the threads input, filtered by the given filtering options. This means that multiple ::stacks invocations can be piped together to achieve more complicated filters. For example, to get threads which have both 'fop_read' and 'cv_wait_sig_swap' in their stack trace, you could do: ::stacks -c fop_read | ::stacks -c cv_wait_sig_swap_core To get the full list of threads in each group, use the '-a' flag: ::stacks -a OPTIONS -a Print all of the grouped threads, instead of just a count. -f Force a re-run of the thread stack gathering -v Be verbose about thread stack gathering. FILTERS -i Show active threads; equivalent to '-S CV -T FREE'. -c func[+offset] Only print threads whose stacks contain func/func+offset. -C func[+offset] Only print threads whose stacks do not contain func/func+offset. -s {type | ALL} Only print threads which are on a 'type' synchronization object (SOBJ). -S {type | ALL} Only print threads which are not on a 'type' SOBJ. -t tstate Only print threads which are in thread state 'tstate'. -T tstate Only print threads which are not in thread state 'tstate'. SOBJ types: mutex rwlock cv sema user user_pi shuttle Thread states: free sleep run onproc zomb stopped wait panic ATTRIBUTES Target: kvm Module: genunix Interface Stability: Unstable --- cut here ---