public inbox for gdb@sourceware.org
 help / color / mirror / Atom feed
* RE: single stepping mips remote programs built with gcc 4.0
@ 2005-11-17 22:39 Newman, Sarah R
  2005-11-17 22:48 ` Daniel Jacobowitz
  0 siblings, 1 reply; 10+ messages in thread
From: Newman, Sarah R @ 2005-11-17 22:39 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb

> Could you please build a debuggable GDB binary, and trace through
> mips32_next_pc?  It looks like it should handle the 'j' instruction
> just fine:
> 
>         case 2:         /* J */
>         case 3:         /* JAL */
>           {
>             unsigned long reg;
>             reg = jtype_target (inst) << 2;
>             /* Upper four bits get never changed... */
>             pc = reg + ((pc + 4) & 0xf0000000);
>           }
>           break;
> 
> J and JAL share a format, so this should be correct.  It's as if the
> value GDB is extracting for the instruction is incorrect.
> 
> -- 
> Daniel Jacobowitz
> CodeSourcery, LLC
> 

I built it with the default options, that good enough? Something like
"-g -O2" it seems.

I doubt that mips32_next_pc is getting compiled in because I can set a
breakpoint at mips_next_pc but not mips32_next_pc.  
mips_software_single_step never gets called in this sequence, should it
be? 

^ permalink raw reply	[flat|nested] 10+ messages in thread
* RE: single stepping mips remote programs built with gcc 4.0
@ 2005-11-23  3:09 Newman, Sarah R
  0 siblings, 0 replies; 10+ messages in thread
From: Newman, Sarah R @ 2005-11-23  3:09 UTC (permalink / raw)
  To: Jim Blandy; +Cc: Daniel Jacobowitz, gdb


 

> You've talked about GDB inserting breakpoints for software
> single-stepping, but you're not using software single-stepping here. 
> Those memory writes are for your user breakpoints at the entry point
> and exit point of main.  The 's' packet indicates that the stub itself
> is doing the single-stepping.

Which run?  The first run I had a user breakpoint at the very beginning of main, the second run I had the breakpoint one instruction after the beginning.

Run 1:

Num Type           Disp Enb Address    What
1   breakpoint     keep y   0xffffffff80001998 in main at tmp.c:11
2   breakpoint     keep y   0xffffffff800019b0 in main at tmp.c:14

gdb) step
(gdb) p/x $pc
$2 = 0x800019a0

(gdb) set debug remote 1
(gdb) step
Sending packet: $m80001998,4#70...Ack
Packet received: 27bdffe8
Sending packet: $M80001998,4:0005000d#43...Ack <-- user breakpoint
Packet received: OK
Sending packet: $m800019b0,4#91...Ack
Packet received: 03e00008
Sending packet: $M800019b0,4:0005000d#64...Ack <-- user breakpoint
Packet received: OK
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 800019a4
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 80001990
Sending packet: $p1d#05...Ack
Packet received: 8402ba60
Sending packet: $p1f#07...Ack
Packet received: 800019a8
Sending packet: $m8000199c,4#9b...Ack
Packet received: afbf0010
Sending packet: $m800019a0,4#90...Ack
Packet received: 0c000664   
Sending packet: $m800019a4,4#94...Ack
Packet received: 00000000
Sending packet: $c#63...Ack  

----
Run 2:

Num Type           Disp Enb Address    What
2   breakpoint     keep y   0xffffffff800019b0 in main at tmp.c:14
3   breakpoint     keep y   0xffffffff8000199c in main at tmp.c:11 <-- one instruction later than run 1

Sending packet: $m800019b0,4#91...Ack
Packet received: 03e00008
Sending packet: $M800019b0,4:0005000d#64...Ack <-- user breakpoint
Packet received: OK
Sending packet: $m8000199c,4#9b...Ack
Packet received: afbf0010
Sending packet: $M8000199c,4:0005000d#6e...Ack <-- user breakpoint
Packet received: OK
Sending packet: $Hc0#db...Ack
Packet received: ENN
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 800019a4
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 80001990
Sending packet: $p1d#05...Ack
Packet received: 8402ba60
Sending packet: $p1f#07...Ack
Packet received: 800019a8
Sending packet: $m80001998,4#70...Ack
Packet received: 27bdffe8
Sending packet: $m800019a0,4#90...Ack
Packet received: 0c000664
Sending packet: $m800019a4,4#94...Ack
Packet received: 00000000
Sending packet: $m80001998,4#70...Ack
Packet received: 27bdffe8
Sending packet: $M80001998,4:0005000d#43...Ack <-- not user breakpoint
Packet received: OK
Sending packet: $c#63...Ack
Packet received: S02
Sending packet: $p25#d7...Ack
Packet received: 800019b0

> 
> > Sending packet: $m8000199c,4#9b...Ack
> > Packet received: afbf0010
> > Sending packet: $m800019a0,4#90...Ack
> > Packet received: 0c000664
> > Sending packet: $m800019a4,4#94...Ack
> > Packet received: 00000000
> 
> This is weird.  It looks like GDB is doing some prologue analysis
> here, but it's not starting at any function's entry point.  That,
> combined with the fact that you said that disassembly shows you the
> wrong code, makes me wonder if the debug info is right.
> 
> When you say 'print &a' or 'print &main', do you get the 
> right addresses?
  
Yes, I get the right addresses. When I disassemble the functions in the console I get the right thing too.
But when I use insight to show an assembly listing of a particular function, it shows the function after.  I did not realize that disassembling in the console and showing the assembly of a function with insight could give different results. 

I said something inaccurate before -- I was compiling this program with "-gstabs+" , not "-g".  I have seen different behavior depending on if I use "-g" or "-gstabs+" with some other programs, but I just tried both flags and it doesn't seem to make a difference here.

^ permalink raw reply	[flat|nested] 10+ messages in thread
* RE: single stepping mips remote programs built with gcc 4.0
@ 2005-11-22 20:00 Newman, Sarah R
  0 siblings, 0 replies; 10+ messages in thread
From: Newman, Sarah R @ 2005-11-22 20:00 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb

Breakpoint 1, step_into_function (ecs=0x22d810)
    at ../../GDB-ISS/gdb/infrun.c:2646
2646      s = find_pc_symtab (stop_pc);
(gdb) p/x stop_pc
$5 = 0xffffffff80001990
(gdb) next
2647      if (s && s->language != language_asm)
(gdb) p *s
$6 = {next = 0x104c6058, blockvector = 0x104ceb68, linetable =
0x104cebd8,
  block_line_section = 2, primary = 1, macro_table = 0x0,
  filename = 0x104cebc8 "tmp.c", dirname = 0x104cec60 "/tmp/",
  free_code = free_linetable, free_func = 0, nlines = 0, line_charpos =
0x0,
  language = language_c, debugformat = 0x104cec68 "stabs", version =
0x0,
  fullname = 0x1051d0f0 "/tmp/tmp.c", objfile = 0x10411fb8}
(gdb) next
2648        ecs->stop_func_start = SKIP_PROLOGUE (ecs->stop_func_start);
(gdb) p/x ecs->stop_func_start
$7 = 0xffffffff80001990
(gdb) step
gdbarch_skip_prologue (gdbarch=0x103fc470, ip=18446744071562074512)
    at ../../GDB-ISS/gdb/gdbarch.c:2909
2909      gdb_assert (gdbarch != NULL);
(gdb) next
2910      gdb_assert (gdbarch->skip_prologue != NULL);
(gdb)
2911      if (gdbarch_debug >= 2)
(gdb)
2913      return gdbarch->skip_prologue (ip);
(gdb) step
mips_skip_prologue (pc=18446744071562074512)
    at ../../GDB-ISS/gdb/mips-tdep.c:4187
4187      if (find_pc_partial_function (pc, NULL, &func_addr, NULL))
(gdb) next
4189          CORE_ADDR post_prologue_pc = skip_prologue_using_sal
(func_addr);
(gdb) p func_addr
$8 = 18446744071562074512
(gdb) p/x func_addr
$9 = 0xffffffff80001990
(gdb) step
skip_prologue_using_sal (func_addr=18446744071562074512)
    at ../../GDB-ISS/gdb/symtab.c:4027
4027      find_pc_partial_function (func_addr, NULL, &start_pc,
&end_pc);
(gdb) next
4028      start_pc += DEPRECATED_FUNCTION_START_OFFSET;
(gdb) p/x start_pc
$10 = 0xffffffff80001990
(gdb) p/x end_pc
$11 = 0xffffffff80001998
(gdb) next
4030      prologue_sal = find_pc_line (start_pc, 0);
(gdb)
4031      if (prologue_sal.line != 0)
(gdb) p prologue_sal
$12 = {symtab = 0x104ceb80, section = 0x0, line = 8,
  pc = 18446744071562074512, end = 18446744071562074520}
(gdb) p/x prologue_sal
$13 = {symtab = 0x104ceb80, section = 0x0, line = 0x8,
  pc = 0xffffffff80001990, end = 0xffffffff80001998}
(gdb) next
4033          while (prologue_sal.end < end_pc)
(gdb) p/x end_pc
$14 = 0xffffffff80001998
(gdb) next
4054      return prologue_sal.end;
(gdb)
4055    }
(gdb)
mips_skip_prologue (pc=18446744071562074512)
    at ../../GDB-ISS/gdb/mips-tdep.c:4190
4190          if (post_prologue_pc != 0)
(gdb)
4191            return max (pc, post_prologue_pc);
(gdb) p/x pc
$15 = 0xffffffff80001990
(gdb) p/x post_prologue_pc
$16 = 0xffffffff80001998
(gdb) next
4208    }
(gdb)
gdbarch_skip_prologue (gdbarch=0x103fc470, ip=18446744071562074512)
    at ../../GDB-ISS/gdb/gdbarch.c:2914
2914    }
(gdb)
step_into_function (ecs=0x22d810) at ../../GDB-ISS/gdb/infrun.c:2650
2650      ecs->sal = find_pc_line (ecs->stop_func_start, 0);
(gdb) p/x ecs->stop_func_start
$17 = 0xffffffff80001998
(gdb) next
2657      if (ecs->sal.end
(gdb) p/x ecs->sal
$18 = {symtab = 0x104ceb80, section = 0x0, line = 0xb,
  pc = 0xffffffff80001998, end = 0xffffffff800019a0}
(gdb) next
2678      if (gdbarch_adjust_breakpoint_address_p (current_gdbarch))
(gdb) next
2685      if (ecs->stop_func_start == stop_pc)
(gdb) next
2696          init_sal (&sr_sal);       /* initialize to zeroes */
(gdb) next
2697          sr_sal.pc = ecs->stop_func_start;
(gdb) next
2698          sr_sal.section = find_pc_overlay (ecs->stop_func_start);
(gdb) next
2703          insert_step_resume_breakpoint_at_sal (sr_sal,
null_frame_id);
(gdb) p/x sr_sal
$19 = {symtab = 0x0, section = 0x0, line = 0x0, pc = 0xffffffff80001998,
  end = 0x0}

^ permalink raw reply	[flat|nested] 10+ messages in thread
* RE: single stepping mips remote programs built with gcc 4.0
@ 2005-11-22 19:48 Newman, Sarah R
  0 siblings, 0 replies; 10+ messages in thread
From: Newman, Sarah R @ 2005-11-22 19:48 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb

> We realize we've stepped into a function call.  But we're continuing
> without setting any breakpoint at all, which is bogus.
> 
> > #0  remote_resume (ptid={pid = -1, lwp = 0, tid = 0}, step=0,
> >     siggnal=TARGET_SIGNAL_0) at ../../GDB-ISS/gdb/remote.c:2603
> > #1  0x004240bb in resume (step=0, sig=TARGET_SIGNAL_0)
> >     at ../../GDB-ISS/gdb/infrun.c:624
> > #2  0x004278b7 in keep_going (ecs=0x22d810) at
> > ../../GDB-ISS/gdb/infrun.c:2825
> > #3  0x00427606 in step_into_function (ecs=0x22d810)
> >     at ../../GDB-ISS/gdb/infrun.c:2708
> > #4  0x00426d3a in handle_inferior_event (ecs=0x22d810)
> >     at ../../GDB-ISS/gdb/infrun.c:2433
> 
> I can see no way at all for step_into_function to call keep_going
> without inserting a stop breakpoint.  Obviously that's gone wrong.
> Please step through that function and tell me where it's trying to put
> the breakpoint, in particular what happens before and during
> insert_step_resume_breakpoint_at_sal.

I believe there's no breakpoint set because where the next software
single step breakpoint would be placed, there is already a breakpoint
there.  
Look at this slightly different run:

Num Type           Disp Enb Address    What
2   breakpoint     keep y   0xffffffff800019b0 in main at tmp.c:14
3   breakpoint     keep y   0xffffffff8000199c in main at tmp.c:11 <--
one instruction later than previous run

Sending packet: $m800019b0,4#91...Ack
Packet received: 03e00008
Sending packet: $M800019b0,4:0005000d#64...Ack
Packet received: OK
Sending packet: $m8000199c,4#9b...Ack
Packet received: afbf0010
Sending packet: $M8000199c,4:0005000d#6e...Ack
Packet received: OK
Sending packet: $Hc0#db...Ack
Packet received: ENN
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 800019a4
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 80001990
Sending packet: $p1d#05...Ack
Packet received: 8402ba60
Sending packet: $p1f#07...Ack
Packet received: 800019a8
Sending packet: $m80001998,4#70...Ack
Packet received: 27bdffe8
Sending packet: $m800019a0,4#90...Ack
Packet received: 0c000664
Sending packet: $m800019a4,4#94...Ack
Packet received: 00000000
Sending packet: $m80001998,4#70...Ack
Packet received: 27bdffe8
Sending packet: $M80001998,4:0005000d#43...Ack <--- was explicit
breakpoint in previous run, but not this run
Packet received: OK
Sending packet: $c#63...Ack
Packet received: S02
Sending packet: $p25#d7...Ack
Packet received: 800019b0

^ permalink raw reply	[flat|nested] 10+ messages in thread
* RE: single stepping mips remote programs built with gcc 4.0
@ 2005-11-22  5:26 Newman, Sarah R
  2005-11-22 19:24 ` Daniel Jacobowitz
  2005-11-23  0:50 ` Jim Blandy
  0 siblings, 2 replies; 10+ messages in thread
From: Newman, Sarah R @ 2005-11-22  5:26 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb

> On Thu, Nov 17, 2005 at 02:23:17PM -0800, Newman, Sarah R wrote:
> > I built it with the default options, that good enough? 
> Something like
> > "-g -O2" it seems.
> > 
> > I doubt that mips32_next_pc is getting compiled in because 
> I can set a
> > breakpoint at mips_next_pc but not mips32_next_pc.  
> > mips_software_single_step never gets called in this 
> sequence, should it
> > be? 
> 
> Could you show me a session transcript?  If mips_software_single_step
> isn't placing the breakpoint, what is?
> 
> mips32_next_pc was probably inlined; you can retry with -g -O0 if you
> want.

mips32_next_pc is not being called.  

It seems that when gdb is single stepping at the source code level it
tries to skip over the function prologues (I could be wrong.)  I am
compiling with options "-g" and "-O2" and gcc 4.0 apparently removes the
prologues for very simple functions. I've been poking around
handle_inferior_event, mips_skip_prologue, and skip_prologue_using_sal
mostly.  I still think the very different assembly produced by gcc 4.0
is causing problems.  I may try comparing the 3.1 runtime behavior with
4.0 but I will have to recompile some libraries in order to do that and
it's late. :P  

Additionally, in the below source code, if you try to to do an assembly
listing within gdb of either function A or B, it shows the function
following within the disassembly.  IE disassembling function B displays
the code for A, and disassembling A displays the code for main, but main
is correctly displayed.

Some source code:

void b(int c){
  printf("%d",c+2);
}

void a(void){
  b(2);
}

int main(){
  a();
  return 0;
}

gcc 3.1 disassembly: 
8000198c <b>:
8000198c:	24850002 	addiu	a1,a0,2
80001990:	3c048403 	lui	a0,0x8403
80001994:	27bdffe8 	addiu	sp,sp,-24
80001998:	afbf0010 	sw	ra,16(sp)
8000199c:	0c002b57 	jal	8000ad5c <printf>
800019a0:	24848000 	addiu	a0,a0,-32768
800019a4:	8fbf0010 	lw	ra,16(sp)
800019a8:	00000000 	nop
800019ac:	03e00008 	jr	ra
800019b0:	27bd0018 	addiu	sp,sp,24

800019b4 <a>:
800019b4:	27bdffe8 	addiu	sp,sp,-24
800019b8:	afbf0010 	sw	ra,16(sp)
800019bc:	0c000663 	jal	8000198c <b>
800019c0:	24040002 	li	a0,2
800019c4:	8fbf0010 	lw	ra,16(sp)
800019c8:	00000000 	nop
800019cc:	03e00008 	jr	ra
800019d0:	27bd0018 	addiu	sp,sp,24

800019d4 <main>:
800019d4:	27bdffe8 	addiu	sp,sp,-24
800019d8:	afbf0010 	sw	ra,16(sp)
800019dc:	0c00066d 	jal	800019b4 <a>
800019e0:	00000000 	nop
800019e4:	8fbf0010 	lw	ra,16(sp)
800019e8:	00001021 	move	v0,zero
800019ec:	03e00008 	jr	ra
800019f0:	27bd0018 	addiu	sp,sp,24

gcc 4.0 disassembly:
80001980 <b>:
80001980:	24850002 	addiu	a1,a0,2
80001984:	3c048402 	lui	a0,0x8402
80001988:	08002b4a 	j	8000ad28 <printf>
8000198c:	24840100 	addiu	a0,a0,256

80001990 <a>:
80001990:	08000660 	j	80001980 <b>
80001994:	24040002 	li	a0,2

80001998 <main>:
80001998:	27bdffe8 	addiu	sp,sp,-24
8000199c:	afbf0010 	sw	ra,16(sp)
800019a0:	0c000664 	jal	80001990 <a>
800019a4:	00000000 	nop
800019a8:	8fbf0010 	lw	ra,16(sp)
800019ac:	00001021 	move	v0,zero
800019b0:	03e00008 	jr	ra
800019b4:	27bd0018 	addiu	sp,sp,24

--
run with 4.0 version:

(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0xffffffff80001998 in main at tmp.c:11
2   breakpoint     keep y   0xffffffff800019b0 in main at tmp.c:14

(gdb) p/x $pc
$1 = 0x80001998

(gdb) step
(gdb) p/x $pc
$2 = 0x800019a0

(gdb) set debug remote 1
(gdb) step
Sending packet: $m80001998,4#70...Ack
Packet received: 27bdffe8
Sending packet: $M80001998,4:0005000d#43...Ack
Packet received: OK
Sending packet: $m800019b0,4#91...Ack
Packet received: 03e00008
Sending packet: $M800019b0,4:0005000d#64...Ack
Packet received: OK
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 800019a4
Sending packet: $s#73...Ack
Packet received: S05
Sending packet: $p25#d7...Ack
Packet received: 80001990
Sending packet: $p1d#05...Ack
Packet received: 8402ba60
Sending packet: $p1f#07...Ack
Packet received: 800019a8
Sending packet: $m8000199c,4#9b...Ack
Packet received: afbf0010
Sending packet: $m800019a0,4#90...Ack
Packet received: 0c000664
Sending packet: $m800019a4,4#94...Ack
Packet received: 00000000
Sending packet: $c#63...Ack
Packet received: S02
Sending packet: $p25#d7...Ack
Packet received: 800019b0

--
Backtrace taken right before the above continue:

#0  remote_resume (ptid={pid = -1, lwp = 0, tid = 0}, step=0,
    siggnal=TARGET_SIGNAL_0) at ../../GDB-ISS/gdb/remote.c:2603
#1  0x004240bb in resume (step=0, sig=TARGET_SIGNAL_0)
    at ../../GDB-ISS/gdb/infrun.c:624
#2  0x004278b7 in keep_going (ecs=0x22d810) at
../../GDB-ISS/gdb/infrun.c:2825
#3  0x00427606 in step_into_function (ecs=0x22d810)
    at ../../GDB-ISS/gdb/infrun.c:2708
#4  0x00426d3a in handle_inferior_event (ecs=0x22d810)
    at ../../GDB-ISS/gdb/infrun.c:2433
#5  0x0042467f in wait_for_inferior () at
../../GDB-ISS/gdb/infrun.c:1000
#6  0x004244c7 in proceed (addr=18446744073709551615,
    siggnal=TARGET_SIGNAL_DEFAULT, step=1) at
../../GDB-ISS/gdb/infrun.c:825
#7  0x00417cc4 in step_1 (skip_subroutines=0, single_inst=0,
count_string=0x0)
    at ../../GDB-ISS/gdb/infcmd.c:717
#8  0x004179ff in step_command (count_string=0x0, from_tty=1)
    at ../../GDB-ISS/gdb/infcmd.c:606

^ permalink raw reply	[flat|nested] 10+ messages in thread
* single stepping mips remote programs built with gcc 4.0
@ 2005-11-17 20:13 Newman, Sarah R
  2005-11-17 20:23 ` Daniel Jacobowitz
  0 siblings, 1 reply; 10+ messages in thread
From: Newman, Sarah R @ 2005-11-17 20:13 UTC (permalink / raw)
  To: gdb

Hi, I have a version of gdb from CVS on 8/29/2005.  I have configured with the target as mips-elf and the host as cygwin and I am using it to connect to a remote mips system.  All of my programs I am trying to run remotely have been built with GCC 4+.  I am single stepping through code where part of it consists of something like the following in the disassembly listing:

00003dac <initialize()>:
00003dac:	24040001 	li	a0,1
00003db0:	08000deb 	j	000037ac <setArraySize(int, int)>
00003db4:	24050001 	li	a1,1

00003db8 <getCurrentBuffer2(int&)>:
00003db8:	3c02bd00 	lui	v0,0xbd00

When stopped at the beginning of the function, I can tell by looking at the remote protocol debug output that a breakpoint is being set in memory at the location of getCurrentBuffer2, not setArraySize.  We suspect that this may have to do with GCC 4+ doing straight jumps to other functions and not jump and link followed by jump register to leave the function.  Has anyone else encountered this or found a solution? 

Thank you,

Sarah Newman

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2005-11-23  2:52 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-11-17 22:39 single stepping mips remote programs built with gcc 4.0 Newman, Sarah R
2005-11-17 22:48 ` Daniel Jacobowitz
  -- strict thread matches above, loose matches on Subject: below --
2005-11-23  3:09 Newman, Sarah R
2005-11-22 20:00 Newman, Sarah R
2005-11-22 19:48 Newman, Sarah R
2005-11-22  5:26 Newman, Sarah R
2005-11-22 19:24 ` Daniel Jacobowitz
2005-11-23  0:50 ` Jim Blandy
2005-11-17 20:13 Newman, Sarah R
2005-11-17 20:23 ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).