lwps revision 1.5 1 # $NetBSD: lwps,v 1.5 2019/05/30 07:17:35 mrg Exp $
2
3 define 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
32 end
33 document lwps
34 ps for lwps
35 end
36
37 define 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
48 end
49 document procs
50 Show one line summary of all processes (ps)
51 end
52
53 define 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"
72 end
73 document threadinfo
74 Print out the stack and other data of a single thread.
75 end
76
77 define 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
93 end
94 document procthreadsaddr
95 Print out the stack of all threads in a particular process,
96 found via struct proc * address.
97 end
98
99 define 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
109 end
110 document procthreadspid
111 Print out the stack of all threads in a particular process,
112 found via PID.
113 end
114
115 define threadlist
116 set $p = allproc.lh_first
117 while ($p)
118 procthreadsaddr $p
119 set $p = $p->p_list.le_next
120 end
121 end
122 document threadlist
123 Print out the stack of all threads in the system.
124 end
125
126 define 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
175 end
176 document lock
177 Print out lockdebug info like ddb does.
178 end
179