Home | History | Annotate | Line # | Download | only in gdbscripts
lwps revision 1.5
      1 #	$NetBSD: lwps,v 1.5 2019/05/30 07:17:35 mrg 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 procs
     38 	set $p = allproc.lh_first
     39 
     40 	printf "           paddr   pid     flag  stat    n         firstlwp          command\n"                       
     41 	while ($p)
     42 		printf "%16lx %5d %8x %4x %5d %16lx %16s\n", \
     43 			$p, $p->p_pid, $p->p_flag, $p->p_stat, \
     44 			$nlwps, $p->p_lwps.lh_first, \
     45 			(char *) $p->p_comm
     46 		set $p = $p->p_list.le_next
     47 	end
     48 end
     49 document procs
     50 Show one line summary of all processes (ps)
     51 end
     52 
     53 define threadinfo
     54 	set $l = (struct lwp *)$arg0
     55 	set $pid = $arg1
     56 
     57 	set $j = 0
     58 	set $n = $l->l_name
     59 	#if ($n == 0)
     60 	#	set $n = (char *)""
     61 	#end
     62 	printf "           laddr   pid   lid     flag                 wchan\n"                       
     63 	printf "%16lx %5d %5d %8x      %16lx", \
     64 		$l, $pid, $l->l_lid, $l->l_flag, $l->l_wchan
     65 	if ($n != 0)
     66 		printf "  %16s", $n
     67 	end
     68         printf "\n\n"
     69         kvm proc $l
     70 	where
     71         printf "\n"
     72 end
     73 document threadinfo
     74 Print out the stack and other data of a single thread.
     75 end
     76 
     77 define procthreadsaddr
     78 	set $p = (struct proc *)$arg0
     79 	set $l = $p->p_lwps.lh_first
     80 	set $nlwps = $p->p_nlwps
     81 	set $pid = $p->p_pid
     82 
     83 	printf "           paddr   pid     flag  stat    n         firstlwp          command\n"                       
     84 	printf "%16lx %5d %8x %4x %5d %16lx %16s\n\n", \
     85 		$p, $pid, $p->p_flag, $p->p_stat, \
     86 		$nlwps, $p->p_lwps.lh_first, \
     87 		(char *) $p->p_comm
     88 	while ($l)
     89 		threadinfo $l $pid
     90 		set $l = $l->l_sibling.le_next
     91 		set $j++
     92 	end
     93 end
     94 document procthreadsaddr
     95 Print out the stack of all threads in a particular process,
     96 found via struct proc * address.
     97 end
     98 
     99 define procthreadspid
    100 	set $pid = (unsigned)$arg0
    101 	set $p = allproc.lh_first
    102 	while ($p)
    103 		if ($pid == $p->p_pid)
    104 			procthreadsaddr $p
    105 			loop_break
    106 		end
    107 		set $p = $p->p_list.le_next
    108 	end
    109 end
    110 document procthreadspid
    111 Print out the stack of all threads in a particular process,
    112 found via PID.
    113 end
    114 
    115 define threadlist
    116 	set $p = allproc.lh_first
    117 	while ($p)
    118 		procthreadsaddr $p
    119 		set $p = $p->p_list.le_next
    120 	end
    121 end
    122 document threadlist
    123 Print out the stack of all threads in the system.
    124 end
    125 
    126 define lock
    127 	set $ld = (struct lockdebug *)ld_rb_tree
    128 	set $a = $ld->ld_lock
    129 	set $b = (volatile void *)$arg0
    130 
    131 	while ($ld && $a != $b)
    132 		if ($a < $b) 
    133 			set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[1]
    134 		end
    135 		if ($a > $b) 
    136 			set $ld = (struct lockdebug *)$ld->ld_rb_node.rb_nodes[0]
    137 		end
    138 		if ($ld == 0)
    139 			loop_break
    140 		end
    141 		set $a = $ld->ld_lock
    142 # printf "a=%lx b=%lx ld=%lx a<b %d a>b %d\n", $a, $b, $ld,  ($a < $b), ($a > $b)
    143 	end
    144 	if ($ld)
    145 		printf "lock address : %#018lx type     : ", \
    146 			(long)$ld->ld_lock
    147 		if ($ld->ld_flags & 0x2)
    148 			printf "sleep/adaptive\n"
    149 		else
    150 			printf "spin\n"
    151 		end
    152 		printf "initialized  : %#018lx", \
    153 			(long)$ld->ld_initaddr
    154 		if ($ld->ld_lockops->lo_type == 0x2)
    155 			printf " interlock: %#018lx\n", $ld->ld_locked
    156 		else
    157 			printf "\n"
    158 			printf "shared holds : %18u exclusive: ", \
    159 				$ld->ld_shares
    160 			if (($ld->ld_flags & 0x1) != 0)
    161 				printf "1\n"
    162 			else
    163 				printf "0\n"
    164 			end
    165 			printf "shares wanted: %18u exclusive: %18u\n", \
    166 				(unsigned)$ld->ld_shwant, (unsigned)$ld->ld_exwant
    167 			printf "cpu last held: %18u\n", \
    168 				(unsigned)$ld->ld_cpu
    169 			printf "current lwp  : %#018lx last held: %#018lx\n", \
    170 				(long)0, (long)$ld->ld_lwp
    171 			printf "last locked  : %#018lx unlocked : %#018lx\n", \
    172 				(long)$ld->ld_locked, (long)$ld->ld_unlocked
    173 		end
    174 	end
    175 end
    176 document lock
    177 Print out lockdebug info like ddb does.
    178 end
    179