Home | History | Annotate | Line # | Download | only in gdbscripts
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