86 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
# gdb scripts for manipulating wchans
 | 
						|
 | 
						|
define allwchans
 | 
						|
    set $n = allwchans.arr.num
 | 
						|
    set $i = 0
 | 
						|
    while ($i < $n)
 | 
						|
	set $p = (struct wchan *)(allwchans.arr.v[$i])
 | 
						|
	set $pnm = $p->wc_name
 | 
						|
	set $pth = &$p->wc_threads
 | 
						|
	set $pct = $pth->tl_count
 | 
						|
	printf "wchan %u @0x%x: %-16s %u\n", $i, $p, $pnm, $pct
 | 
						|
	set $i++
 | 
						|
    end
 | 
						|
end
 | 
						|
document allwchans
 | 
						|
Dump the allwchans table.
 | 
						|
Usage: allwchans
 | 
						|
end
 | 
						|
 | 
						|
define wchan
 | 
						|
    set $p = (struct wchan *)(allwchans.arr.v[$arg0])
 | 
						|
    set $pnm = $p->wc_name
 | 
						|
    set $pth = $p->wc_threads
 | 
						|
    set $pct = $pth.tl_count
 | 
						|
    printf "wchan %u @0x%x: %-16s %u:\n", $arg0, $p, $pnm, $pct
 | 
						|
    threadlist $pth
 | 
						|
end
 | 
						|
document wchan
 | 
						|
Dump a particular wchan.
 | 
						|
Usage: wchan N
 | 
						|
(where N is the index into allwchans[] reported by allwchans)
 | 
						|
end
 | 
						|
 | 
						|
define threadlist
 | 
						|
    set $t = $arg0.tl_head.tln_next->tln_self
 | 
						|
    while ($t != 0)
 | 
						|
	printf "thread %s @0x%x\n", $t->t_name, $t
 | 
						|
	set $t = $t->t_listnode.tln_next->tln_self
 | 
						|
    end
 | 
						|
end
 | 
						|
document threadlist
 | 
						|
Dump a threadlist.
 | 
						|
Usage: threadlist mycpu->c_runqueue
 | 
						|
end
 | 
						|
 | 
						|
define allcpus
 | 
						|
    set $n = allcpus.arr.num
 | 
						|
    set $i = 0
 | 
						|
    while ($i < $n)
 | 
						|
	set $c = (struct cpu *)(allcpus.arr.v[$i])
 | 
						|
	set $id = $c->c_isidle
 | 
						|
	set $ln = $c->c_spinlocks
 | 
						|
	set $t = $c->c_curthread
 | 
						|
	set $zom = $c->c_zombies.tl_count
 | 
						|
	set $rn = $c->c_runqueue.tl_count
 | 
						|
	printf "cpu %u @0x%x: ", $i, $c
 | 
						|
	if ($id)
 | 
						|
	    printf "idle, "
 | 
						|
	else
 | 
						|
	    printf "running, "
 | 
						|
	end
 | 
						|
	printf "%u spinlocks, ", $ln
 | 
						|
	if ($t)
 | 
						|
	    printf "current: %s @0x%x\n", $t->t_name, $t
 | 
						|
	else
 | 
						|
	    printf "no current thread (?)\n"
 | 
						|
	end
 | 
						|
	if ($zom > 0)
 | 
						|
	    printf "%u zombies:\n", $zom
 | 
						|
	    threadlist $c->c_zombies
 | 
						|
	end
 | 
						|
	if ($rn > 0)
 | 
						|
	    printf "%u threads in run queue:\n", $rn
 | 
						|
	    threadlist $c->c_zombies
 | 
						|
	else
 | 
						|
	    printf "run queue empty\n"
 | 
						|
	end
 | 
						|
	printf "\n"
 | 
						|
	set $i++
 | 
						|
    end
 | 
						|
end
 | 
						|
document allcpus
 | 
						|
Dump all cpus.
 | 
						|
Usage: allcpus
 | 
						|
end
 |