Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GDB ignores my breakpoints

Tags:

gdb

My test case is so simple that I must be doing something very stupid. I wrote a simple source file test.c:

#include<stdio.h>

int main(int argc,char* argv[]){
    printf("1\n");
    printf("2\n");
    printf("3\n");
    return 0;
}

I compiled it with gcc -g test.c and started GDB with gdb a.out. Then I created a breakpoint in main with break main and ran it with run(also tried with start) - but GDB simply ignored my breakpoint!

This is the shell session of me trying to compile test.c and run GDB:

[idanarye@idanarye_lg gdbtest]$ gcc -g test.c
[idanarye@idanarye_lg gdbtest]$ gdb a.out
GNU gdb (GDB) 7.6.1
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/idanarye/gdbtest/a.out...done.
(gdb) break main
Breakpoint 1 at 0x40050f: file test.c, line 4.
(gdb) run
Starting program: /home/idanarye/gdbtest/a.out 
1
2
3
During startup program exited normally.
(gdb) 

What in the world am I doing wrong here?

I'm running a 64bit Arch Linux. My GCC version is 4.8.2.

UPDATE

Here is the result of disas main:

Dump of assembler code for function main:
   0x0000000000400500 <+0>:     push   %rbp
   0x0000000000400501 <+1>:     mov    %rsp,%rbp
   0x0000000000400504 <+4>:     sub    $0x10,%rsp
   0x0000000000400508 <+8>:     mov    %edi,-0x4(%rbp)
   0x000000000040050b <+11>:    mov    %rsi,-0x10(%rbp)
   0x000000000040050f <+15>:    mov    $0x4005c4,%edi
   0x0000000000400514 <+20>:    callq  0x4003e0 <puts@plt>
   0x0000000000400519 <+25>:    mov    $0x4005c6,%edi
   0x000000000040051e <+30>:    callq  0x4003e0 <puts@plt>
   0x0000000000400523 <+35>:    mov    $0x4005c8,%edi
   0x0000000000400528 <+40>:    callq  0x4003e0 <puts@plt>
   0x000000000040052d <+45>:    mov    $0x0,%eax
   0x0000000000400532 <+50>:    leaveq 
   0x0000000000400533 <+51>:    retq   
End of assembler dump. 

UPDATE

No idea how or why, but it works now. Probably a system update fixed it...

like image 692
Idan Arye Avatar asked Dec 27 '13 23:12

Idan Arye


People also ask

Why is GDB not stopping at breakpoint?

GDB normally ignores breakpoints when it resumes execution, until at least one instruction has been executed. If it did not do this, you would be unable to proceed past a breakpoint without first disabling the breakpoint. This rule applies whether or not the breakpoint already existed when your program stopped.

How do I run breakpoints in GDB?

You can also set breakpoints on function names. To do this, just type "break [functionname]". gdb will stop your program just before that function is called. Breakpoints stay set when your program ends, so you do not have to reset them unless you quit gdb and restart it.

How do you keep breakpoints?

Set breakpoints in source code To set a breakpoint in source code: Click in the far left margin next to a line of code. You can also select the line and press F9, select Debug > Toggle Breakpoint, or right-click and select Breakpoint > Insert breakpoint. The breakpoint appears as a red dot in the left margin.

Does GDB use hardware breakpoints?

For some targets, GDB can automatically decide if hardware or software breakpoints should be used, depending on whether the breakpoint address is read-only or read-write. This applies to breakpoints set with the break command as well as to internal breakpoints set by commands like next and finish .


1 Answers

(curated from comments)

You do not appear do be doing anything wrong; It appears to be GDB's fault.

The message During startup program exited normally. is anomalous, the correct one being Program exited normally.. It suggests GDB failed to insert a breakpoint in main() or the traced program's call to ptrace(PT_TRACE_ME, 0, 0, 0) failed. The program thus ran without being stopped, and it exited while GDB was only expecting it to start up and stop at exec(). Can you run gdb under strace while doing your example and grep strace's log for any failed ptrace calls?

You would do so with strace -f -o syscall.txt gdb ./a.out.

As of right now a stop-gap measure appears to be to run GDB as root.

like image 151
Iwillnotexist Idonotexist Avatar answered Sep 17 '22 20:09

Iwillnotexist Idonotexist