1# $NetBSD: lwps,v 1.6 2019/07/17 09:14:24 skrll 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 threadinfo 38 set $l = (struct lwp *)$arg0 39 set $pid = $arg1 40 41 set $j = 0 42 set $n = $l->l_name 43 #if ($n == 0) 44 # set $n = (char *)"" 45 #end 46 printf " laddr pid lid flag wchan\n" 47 printf "%16lx %5d %5d %8x %16lx", \ 48 $l, $pid, $l->l_lid, $l->l_flag, $l->l_wchan 49 if ($n != 0) 50 printf " %16s", $n 51 end 52 printf "\n\n" 53 kvm proc $l 54 where 55 printf "\n" 56end 57document threadinfo 58Print out the stack and other data of a single thread. 59end 60 61define procthreadsaddr 62 set $p = (struct proc *)$arg0 63 set $l = $p->p_lwps.lh_first 64 set $nlwps = $p->p_nlwps 65 set $pid = $p->p_pid 66 67 printf " paddr pid flag stat n firstlwp command\n" 68 printf "%16lx %5d %8x %4x %5d %16lx %16s\n\n", \ 69 $p, $pid, $p->p_flag, $p->p_stat, \ 70 $nlwps, $p->p_lwps.lh_first, \ 71 (char *) $p->p_comm 72 while ($l) 73 threadinfo $l $pid 74 set $l = $l->l_sibling.le_next 75 set $j++ 76 end 77end 78document procthreadsaddr 79Print out the stack of all threads in a particular process, 80found via struct proc * address. 81end 82 83define procthreadspid 84 set $pid = (unsigned)$arg0 85 set $p = allproc.lh_first 86 while ($p) 87 if ($pid == $p->p_pid) 88 procthreadsaddr $p 89 loop_break 90 end 91 set $p = $p->p_list.le_next 92 end 93end 94document procthreadspid 95Print out the stack of all threads in a particular process, 96found via PID. 97end 98 99define threadlist 100 set $p = allproc.lh_first 101 while ($p) 102 procthreadsaddr $p 103 set $p = $p->p_list.le_next 104 end 105end 106document threadlist 107Print out the stack of all threads in the system. 108end 109 110define lock 111 set $ld = (struct lockdebug *)ld_rb_tree 112 set $a = $ld->ld_lock 113 set $b = (volatile void *)$arg0 114 115 while ($ld && $a != $b) 116 if ($a < $b) 117 set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[1] 118 end 119 if ($a > $b) 120 set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[0] 121 end 122 if ($ld == 0) 123 loop_break 124 end 125 set $a = $ld->ld_lock 126# printf "a=%lx b=%lx ld=%lx a<b %d a>b %d\n", $a, $b, $ld, ($a < $b), ($a > $b) 127 end 128 if ($ld) 129 printf "lock address : %#018lx type : ", \ 130 (long)$ld->ld_lock 131 if ($ld->ld_flags & 0x2) 132 printf "sleep/adaptive\n" 133 else 134 printf "spin\n" 135 end 136 printf "initialized : %#018lx", \ 137 (long)$ld->ld_initaddr 138 if ($ld->ld_lockops->lo_type == 0x2) 139 printf " interlock: %#018lx\n", $ld->ld_locked 140 else 141 printf "\n" 142 printf "shared holds : %18u exclusive: ", \ 143 $ld->ld_shares 144 if (($ld->ld_flags & 0x1) != 0) 145 printf "1\n" 146 else 147 printf "0\n" 148 end 149 printf "shares wanted: %18u exclusive: %18u\n", \ 150 (unsigned)$ld->ld_shwant, (unsigned)$ld->ld_exwant 151 printf "cpu last held: %18u\n", \ 152 (unsigned)$ld->ld_cpu 153 printf "current lwp : %#018lx last held: %#018lx\n", \ 154 (long)0, (long)$ld->ld_lwp 155 printf "last locked : %#018lx unlocked : %#018lx\n", \ 156 (long)$ld->ld_locked, (long)$ld->ld_unlocked 157 end 158 end 159end 160document lock 161Print out lockdebug info like ddb does. 162end 163