how to find out what the other CPU is doing
Randall Stewart
rrs at cisco.com
Sun Jan 28 12:39:03 UTC 2007
All:
Ok, I did not get an answer to this.. and of course
I hit the bug again (which I now figured out how to
fix :-D)
So let me explain what I did.. so that way I
can come back and find this email later when it
someday happens again ;-) (and for anyone else
curious).
1) I had to do this from DDB ... I could not find a
way in kgdb.
2) When you stop the machine in ddb (at least in i386) it
dumps BOTH CPU's info in something called
stoppcbs[num-cpus]
3) Its an array of struct pcb .. which has all the info
you need to get started.
4) With a trusty x/ stoppcbs you can work your way through
and gather the info you need.. For x86 the second CPU
started at stoppcbs+0x270 .. if you don't want to look
at all those 0's (of course the offset could change and
will vary from CPU type to CPU type :-D)
5) Dig out the ebp from here. You can look at the IP
but it will be in some NMI stop CPU routine.
6) You can use the bp to trace backward through the stack
and figure out the running stack trace... I went back
to kgdb after getting the ebp (with CPU still spinning away).
7) You have to go several frames back to get by all the NMI
stuff before you find your guilty party :-)
There might be a better way to do this.. and I am thinking
about adding a machine dependent trace that can take
a ebp argument (if one does not already exist in kgdb.. I
suppose I need to poke around in the macro's a bit).. anyway
its primitive .. but it allows you to find that spinning
kernel routine :-)
R
--
Randall Stewart
NSSTG - Cisco Systems Inc.
803-345-0369 <or> 803-317-4952 (cell)
More information about the freebsd-current
mailing list