lwps revision 1.5
1# $NetBSD: lwps,v 1.5 2019/05/30 07:17:35 mrg Exp $ 2 3define lwps 4 set $i = 0 5 6 while ($i < 2) 7 if ($i == 0) 8 set $p = allproc.lh_first 9 end 10 if ($p) 11 printf "\t lwp pid lid flag wchan\n" 12 end 13 while ($p) 14 set $l = $p->p_lwps.lh_first 15 set $j = 0 16 while ($j < $p->p_nlwps) 17 printf "0x%016lx %5d %5d %8x 0x%016lx", \ 18 $l, $p->p_pid, $l->l_lid, $l->l_flag, $l->l_wchan 19 if ($l->l_wmesg) 20 printf " (%s)", (char *)$l->l_wmesg 21# If the preceding command cannot dereference the pointer, use this instead: 22# printf " (%lx)", $l->l_wmesg 23 end 24 set $l = $l->l_sibling.le_next 25 printf "\n" 26 set $j++ 27 end 28 set $p = $p->p_list.le_next 29 end 30 set $i++ 31 end 32end 33document lwps 34ps for lwps 35end 36 37define procs 38 set $p = allproc.lh_first 39 40 printf " paddr pid flag stat n firstlwp command\n" 41 while ($p) 42 printf "%16lx %5d %8x %4x %5d %16lx %16s\n", \ 43 $p, $p->p_pid, $p->p_flag, $p->p_stat, \ 44 $nlwps, $p->p_lwps.lh_first, \ 45 (char *) $p->p_comm 46 set $p = $p->p_list.le_next 47 end 48end 49document procs 50Show one line summary of all processes (ps) 51end 52 53define threadinfo 54 set $l = (struct lwp *)$arg0 55 set $pid = $arg1 56 57 set $j = 0 58 set $n = $l->l_name 59 #if ($n == 0) 60 # set $n = (char *)"" 61 #end 62 printf " laddr pid lid flag wchan\n" 63 printf "%16lx %5d %5d %8x %16lx", \ 64 $l, $pid, $l->l_lid, $l->l_flag, $l->l_wchan 65 if ($n != 0) 66 printf " %16s", $n 67 end 68 printf "\n\n" 69 kvm proc $l 70 where 71 printf "\n" 72end 73document threadinfo 74Print out the stack and other data of a single thread. 75end 76 77define procthreadsaddr 78 set $p = (struct proc *)$arg0 79 set $l = $p->p_lwps.lh_first 80 set $nlwps = $p->p_nlwps 81 set $pid = $p->p_pid 82 83 printf " paddr pid flag stat n firstlwp command\n" 84 printf "%16lx %5d %8x %4x %5d %16lx %16s\n\n", \ 85 $p, $pid, $p->p_flag, $p->p_stat, \ 86 $nlwps, $p->p_lwps.lh_first, \ 87 (char *) $p->p_comm 88 while ($l) 89 threadinfo $l $pid 90 set $l = $l->l_sibling.le_next 91 set $j++ 92 end 93end 94document procthreadsaddr 95Print out the stack of all threads in a particular process, 96found via struct proc * address. 97end 98 99define procthreadspid 100 set $pid = (unsigned)$arg0 101 set $p = allproc.lh_first 102 while ($p) 103 if ($pid == $p->p_pid) 104 procthreadsaddr $p 105 loop_break 106 end 107 set $p = $p->p_list.le_next 108 end 109end 110document procthreadspid 111Print out the stack of all threads in a particular process, 112found via PID. 113end 114 115define threadlist 116 set $p = allproc.lh_first 117 while ($p) 118 procthreadsaddr $p 119 set $p = $p->p_list.le_next 120 end 121end 122document threadlist 123Print out the stack of all threads in the system. 124end 125 126define lock 127 set $ld = (struct lockdebug *)ld_rb_tree 128 set $a = $ld->ld_lock 129 set $b = (volatile void *)$arg0 130 131 while ($ld && $a != $b) 132 if ($a < $b) 133 set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[1] 134 end 135 if ($a > $b) 136 set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[0] 137 end 138 if ($ld == 0) 139 loop_break 140 end 141 set $a = $ld->ld_lock 142# printf "a=%lx b=%lx ld=%lx a<b %d a>b %d\n", $a, $b, $ld, ($a < $b), ($a > $b) 143 end 144 if ($ld) 145 printf "lock address : %#018lx type : ", \ 146 (long)$ld->ld_lock 147 if ($ld->ld_flags & 0x2) 148 printf "sleep/adaptive\n" 149 else 150 printf "spin\n" 151 end 152 printf "initialized : %#018lx", \ 153 (long)$ld->ld_initaddr 154 if ($ld->ld_lockops->lo_type == 0x2) 155 printf " interlock: %#018lx\n", $ld->ld_locked 156 else 157 printf "\n" 158 printf "shared holds : %18u exclusive: ", \ 159 $ld->ld_shares 160 if (($ld->ld_flags & 0x1) != 0) 161 printf "1\n" 162 else 163 printf "0\n" 164 end 165 printf "shares wanted: %18u exclusive: %18u\n", \ 166 (unsigned)$ld->ld_shwant, (unsigned)$ld->ld_exwant 167 printf "cpu last held: %18u\n", \ 168 (unsigned)$ld->ld_cpu 169 printf "current lwp : %#018lx last held: %#018lx\n", \ 170 (long)0, (long)$ld->ld_lwp 171 printf "last locked : %#018lx unlocked : %#018lx\n", \ 172 (long)$ld->ld_locked, (long)$ld->ld_unlocked 173 end 174 end 175end 176document lock 177Print out lockdebug info like ddb does. 178end 179