lwps revision 1.3.8.1 1 # $NetBSD: lwps,v 1.3.8.1 2011/02/08 16:19:58 bouyer 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 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
67 end
68 document threadlist
69 Print out the stack of all threads in the system.
70 end
71
72 define 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
121 end
122 document lock
123 Print out lockdebug info like ddb does.
124 end
125