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