1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
|
# $NetBSD: lwps,v 1.3 2009/11/18 18:12:00 eeh Exp $
define lwps
set $i = 0
while ($i < 2)
if ($i == 0)
set $p = allproc.lh_first
end
if ($p)
printf "\t lwp pid lid flag wchan\n"
end
while ($p)
set $l = $p->p_lwps.lh_first
set $j = 0
while ($j < $p->p_nlwps)
printf "0x%16lx %5d %5d %8x 0x%16lx", \
$l, $p->p_pid, $l->l_lid, $l->l_flag, $l->l_wchan
if ($l->l_wmesg)
printf " (%s)", (char *)$l->l_wmesg
# If the preceding command cannot dereference the pointer, use this instead:
# printf " (%lx)", $l->l_wmesg
end
set $l = $l->l_sibling.le_next
printf "\n"
set $j++
end
set $p = $p->p_list.le_next
end
set $i++
end
end
document lwps
ps for lwps
end
define threadlist
set $i = 0
while ($i < 2)
if ($i == 0)
set $p = allproc.lh_first
end
while ($p)
set $l = $p->p_lwps.lh_first
set $j = 0
while ($j < $p->p_nlwps)
printf "\n"
printf "proc: %16lx %5d %8x %4x %5d %16lx %s", \
$p, $p->p_pid, \
$p->p_flag, $p->p_stat, $p->p_nlwps, $p->p_lwps.lh_first, \
(char *) $p->p_comm
printf "\n"
printf "Thread: %16lx %5d %5d %8x %16lx\n", \
$l, $p->p_pid, $l->l_lid, $l->l_flag, $l->l_wchan
kvm proc $l
where
printf "\n"
printf "\n"
set $l = $l->l_sibling.le_next
set $j++
end
set $p = $p->p_list.le_next
end
set $i++
end
end
document threadlist
Print out the stack of all threads in the system.
end
define lock
set $ld = (struct lockdebug *)ld_rb_tree
set $a = $ld->ld_lock
set $b = (volatile void *)$arg0
while ($ld && $a != $b)
if ($a < $b)
set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[1]
end
if ($a > $b)
set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[0]
end
if ($ld == 0)
loop_break
end
set $a = $ld->ld_lock
# printf "a=%lx b=%lx ld=%lx a<b %d a>b %d\n", $a, $b, $ld, ($a < $b), ($a > $b)
end
if ($ld)
printf "lock address : %#018lx type : ", \
(long)$ld->ld_lock
if ($ld->ld_flags & 0x2)
printf "sleep/adaptive\n"
else
printf "spin\n"
end
printf "initialized : %#018lx", \
(long)$ld->ld_initaddr
if ($ld->ld_lockops->lo_type == 0x2)
printf " interlock: %#018lx\n", $ld->ld_locked
else
printf "\n"
printf "shared holds : %18u exclusive: ", \
$ld->ld_shares
if (($ld->ld_flags & 0x1) != 0)
printf "1\n"
else
printf "0\n"
end
printf "shares wanted: %18u exclusive: %18u\n", \
(unsigned)$ld->ld_shwant, (unsigned)$ld->ld_exwant
printf "cpu last held: %18u\n", \
(unsigned)$ld->ld_cpu
printf "current lwp : %#018lx last held: %#018lx\n", \
(long)0, (long)$ld->ld_lwp
printf "last locked : %#018lx unlocked : %#018lx\n", \
(long)$ld->ld_locked, (long)$ld->ld_unlocked
end
end
end
document lock
Print out lockdebug info like ddb does.
end
|