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