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