lwps revision 1.6 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