This is the mail archive of the
gdb@sources.redhat.com
mailing list for the GDB project.
Re: View registers from stack frames
>>With the stack commands (frame, up, down) I can select a different
>>stack frame. Local variables and arguments (even with same name)
>>have different values, depending on the stack frame number. But it
>>seems that registers aren't corrected for previous stack frames. Is
>>this correct? e.g. the PC and LR should change their value on every
>>frame, and the PC was the last LR. But "info reg" always shows the
>>same values. Is there any way to get the previous frame's registers?
>>When I do "info frame x" I get something like "saved pc 0x..." so at
>>least this information is available, why isn't this put into the register
>>overview? And what about the other SPRs and GPRs?
>
>You've just described the expected and correct behavior. That makes it sound like an architecture specific bug. Which architecture system is this on, and can you post a transcript.
I'm using a self built gdb-6.1.1 for PPC-targets and cygwin. The
communication with the target is over a stub-server to a PPC-board.
This is some sample session snippet:
(gdb) thread 21
[Switching to thread 21 (Thread 1578452)]#0 CMyWorkerTask::Test (
this=0x1815d4, str=@0x18d734)
at N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:476
476 while (uTest2 < 3000001){
(gdb) bt
#0 CMyWorkerTask::Test (this=0x1815d4, str=@0x18d734)
at N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:476
#1 0x00060564 in CMyWorkerTask::Test (this=0x1815d4, str=@0x18d734)
at N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:469
#2 0x00060408 in CMyWorkerTask::Action (this=0x1815d4)
at N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:433
#3 0x0008c8a8 in CINOSTask::MainLoop (this=0x1815d4)
at N:\Temp\SAMCLASS\os\inos\Src\Inos.cpp:823
#4 0x0008c6bc in CINOSTask::CINOSTask (this=0x1815d4,
aName=0x64646464 "|ù\022", aStackSize=1684300900, aPriority=1684300900,
aFloatingPoint=1684300900, aTimeSlice=1684300900,
aInterruptsDisabled=1684300900, apHandler=0x64646464, apObject=0x132fb8)
at N:\Temp\SAMCLASS\os\inos\Src\Inos.cpp:786
#5 0x32414000 in ?? ()
(gdb) p/x $pc
$1 = 0x6056c
(gdb) p/x $lr
$2 = 0x60564
(gdb) f 1
#1 0x00060564 in CMyWorkerTask::Test (this=0x1815d4, str=@0x18d734)
at N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:469
469 Test(str);
(gdb) info frame 1
Stack frame at 0x18d6b4:
pc = 0x60564 in CMyWorkerTask::Test(CINOSString &)
(N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:469); saved pc 0x60408
called by frame at 0x18d6fc, caller of frame at 0x18d66c
source language c++.
Arglist at 0x18d6b4, args: this=0x1815d4, str=@0x18d734
Locals at 0x18d6b4, Previous frame's sp in r1
(gdb) p/x $pc
$3 = 0x6056c
(gdb) p/x $lr
$4 = 0x60564
(gdb) frame 2
#2 0x00060408 in CMyWorkerTask::Action (this=0x1815d4)
at N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:433
433 Test(str);
(gdb) info frame 2
Stack frame at 0x18d6fc:
pc = 0x60408 in CMyWorkerTask::Action(void)
(N:\Temp\SAMCLASS\Applicat\Src\Test1.cpp:433); saved pc 0x8c8a8
called by frame at 0x18d7d4, caller of frame at 0x18d6b4
source language c++.
Arglist at 0x18d6fc, args: this=0x1815d4
Locals at 0x18d6fc, Previous frame's sp in r1
(gdb) p/x $pc
$5 = 0x6056c
(gdb) p/x $lr
$6 = 0x60564
My question is: why do pc and lr (and all other registers) always show the same
value even if I have selected another stack frame? I would have expected that pc
changes to 0x60564 in frame 1 and 0x60408 in frame 2, lr likewise to 0x60408
in frame 1 and 0x8c8a8 in frame 2. Why is this not the case? That's a little bit
misleading. I would like not only to see variables and arguments in previous
frames but also the registers.
Thanks
bye Fabi