Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does gdb stop at a different line than "i b" shows while returning from function?

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?

like image 381
user1042840 Avatar asked Jul 28 '12 15:07

user1042840


People also ask

At which point does GDB stop a running program?

gdb will stop your program at whatever line it has just executed. From here you can examine variables and move through your program. To specify other places where gdb should stop, see the section on breakpoints below.

How do you remove a break point in GDB?

With the clear command you can delete breakpoints according to where they are in your program. With the delete command you can delete individual breakpoints, watchpoints, or catchpoints by specifying their breakpoint numbers.


1 Answers

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):

b display
r
f 1
b
disassemble $pc
...
   0x0040118d <+29>:    call   0x401199 <display>
=> 0x00401192 <+34>:    mov    $0x0,%eax
   0x00401197 <+39>:    leave

i b
...
2       breakpoint     keep y   0x00401192 in main at try5.c:8

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.

like image 146
Karoly Horvath Avatar answered Oct 03 '22 16:10

Karoly Horvath