xref: /netbsd/sys/gdbscripts/lwps (revision 6550d01e)
1#	$NetBSD: lwps,v 1.4 2011/02/05 14:12:05 yamt 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 threadlist
38	set $i = 0
39
40	while ($i < 2)
41		if ($i == 0)
42			set $p = allproc.lh_first
43		end
44		while ($p)
45			set $l = $p->p_lwps.lh_first
46			set $j = 0
47			while ($j < $p->p_nlwps)
48			        printf "\n"
49			printf "proc: %16lx %5d %8x %4x %5d %16lx %s", \
50				$p, $p->p_pid, \
51				$p->p_flag, $p->p_stat, $p->p_nlwps, $p->p_lwps.lh_first, \
52				(char *) $p->p_comm
53			printf "\n"
54				printf "Thread: %16lx %5d %5d %8x %16lx\n", \
55					$l, $p->p_pid, $l->l_lid, $l->l_flag, $l->l_wchan
56			        kvm proc $l
57				where
58			        printf "\n"
59			        printf "\n"
60				set $l = $l->l_sibling.le_next
61				set $j++
62		end
63			set $p = $p->p_list.le_next
64		end
65		set $i++
66	end
67end
68document threadlist
69Print out the stack of all threads in the system.
70end
71
72define lock
73	set $ld = (struct lockdebug *)ld_rb_tree
74	set $a = $ld->ld_lock
75	set $b = (volatile void *)$arg0
76
77	while ($ld && $a != $b)
78		if ($a < $b)
79			set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[1]
80		end
81		if ($a > $b)
82			set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[0]
83		end
84		if ($ld == 0)
85			loop_break
86		end
87		set $a = $ld->ld_lock
88# printf "a=%lx b=%lx ld=%lx a<b %d a>b %d\n", $a, $b, $ld,  ($a < $b), ($a > $b)
89	end
90	if ($ld)
91		printf "lock address : %#018lx type     : ", \
92			(long)$ld->ld_lock
93		if ($ld->ld_flags & 0x2)
94			printf "sleep/adaptive\n"
95		else
96			printf "spin\n"
97		end
98		printf "initialized  : %#018lx", \
99			(long)$ld->ld_initaddr
100		if ($ld->ld_lockops->lo_type == 0x2)
101			printf " interlock: %#018lx\n", $ld->ld_locked
102		else
103			printf "\n"
104			printf "shared holds : %18u exclusive: ", \
105				$ld->ld_shares
106			if (($ld->ld_flags & 0x1) != 0)
107				printf "1\n"
108			else
109				printf "0\n"
110			end
111			printf "shares wanted: %18u exclusive: %18u\n", \
112				(unsigned)$ld->ld_shwant, (unsigned)$ld->ld_exwant
113			printf "cpu last held: %18u\n", \
114				(unsigned)$ld->ld_cpu
115			printf "current lwp  : %#018lx last held: %#018lx\n", \
116				(long)0, (long)$ld->ld_lwp
117			printf "last locked  : %#018lx unlocked : %#018lx\n", \
118				(long)$ld->ld_locked, (long)$ld->ld_unlocked
119		end
120	end
121end
122document lock
123Print out lockdebug info like ddb does.
124end
125