From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eli Zaretskii To: fnasser@redhat.com Cc: gdb@sources.redhat.com Subject: Re: "next" single-steps all the way Date: Wed, 11 Apr 2001 08:37:00 -0000 Message-id: <200104111537.LAA30385@delorie.com> References: <200104111215.IAA15143@delorie.com> <3AD453C2.469326AF@redhat.com> X-SW-Source: 2001-04/msg00086.html > Date: Wed, 11 Apr 2001 08:53:22 -0400 > From: Fernando Nasser > > The core of the problem is that GDB is not recognizing car7() as a > function (method). Maybe it has been inlined? It is definitely inlined. > To prevent this cases, we could add a new GDB setting: max_single_steps > that would cause a confirmation message to be asked to the user (after > printing where it is currently). Seems like a good idea. I will try to find a way to do that, thanks for the hint. > Anyway, your problem seem to be related to prologue-less functions. The > in_prologue() test is not firing. No, in_prologue is not even called in this case. The actual reason for single-stepping seems to be that COFF debug info used by DJGPP doesn't handle inlining well enough. This part of the program: int main() { count = 0; Paths::car7(); together with the inlined car7 code, is seen by gdb as only one long line. Observe: (gdb) list 17 int main() 18 { 19 count = 0; 20 Paths::car7(); 21 count += 2; 22 return count; 23 } (gdb) info line 19 Line 19 of "car.cc" starts at address 0x1570
and ends at 0x15c6 . (gdb) info line 20 Line 20 of "car.cc" is at address 0x15c6 but contains no code. So GDB thinks that line 19 starts at 0x1570, the beginning of `main', and ends at 0x15c6. Disassembly shows that this range includes the entire inlined code of car7(). So this code in handle_inferior_event: /* If stepping through a line, keep going if still within it. Note that step_range_end is the address of the first instruction beyond the step range, and NOT the address of the last instruction within it! */ if (stop_pc >= step_range_start && stop_pc < step_range_end) { /* We might be doing a BPSTAT_WHAT_SINGLE and getting a signal. So definately need to check for sigtramp here. */ check_sigtramp2 (ecs); keep_going (ecs); return; } keeps single-stepping all the way. Thanks for the feedback.