Here is the program I am trying to debug:
#include <stdio.h>
int i = 5;
int main(void)
{
int x = 3;
display(x);
return 0;
}
void display(int x)
{
for ( i=0; i<x; ++i ) {
printf("i is %d.\n", i);
}
}
This code is coming from here http://www.dirac.org/linux/gdb/05-Stepping_And_Resuming.php#breakpointsandwatchpoints. Here is the problem:
(gdb) break display
Breakpoint 1 at 0x40051e: file try5.c, line 15.
(gdb) run
Starting program: /home/ja/gdb/learning/try5
Breakpoint 1, display (x=3) at try5.c:15
(gdb) frame 1
#1 0x000000000040050c in main () at try5.c:8
(gdb) break
Breakpoint 2 at 0x40050c: file try5.c, line 8.
(gdb) c
Continuing.
i is 0.
i is 1.
i is 2.
Breakpoint 2, main () at try5.c:9
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040051e in display at try5.c:15
breakpoint already hit 1 time
2 breakpoint keep y 0x000000000040050c in main at try5.c:8
breakpoint already hit 1 time
(gdb) c
Continuing.
Program exited normally.
(gdb) q
Debugger finished
It was supposed to stop at line 8 in main() but it stopped at line 9 it main(). For me it’s misleading. I think it should stop at line 9, because this is what ‘break’ commands does – sets a break point at the very next instruction. But why “info breakpoints” said that the break point was set at line 8?
The breakpoint is placed at the right place, as you saw, because it did break after returning from the function. If you do a disassemble, you’ll also see that the breakpoint is placed at the right instruction (in this example at 0x00401192):
But it shows the wrong line number. First I thought it might be related to function return, so I added extra instructions after the display call, but it still shows the wrong line.
This looks a bug to me.