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