gdb crash when using breakpoints

1

In every program I try to debug, I am getting the same result, every time I use breakpoints and try to run any program gdb crash. I tried the same thing on different programs and it keeps acting like this.

I will show the result on this simple:

int main(int argc,char* argv[]){
    for(int i = 0;i < 200; i++){
        printf("%d\n",i);
    }
}
gcc main.c -m32 -std=c99 -o test
GNU gdb (Debian 8.3-1) 8.3
Copyright (C) 2019 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(No debugging symbols found in test)
(gdb) disas main
Dump of assembler code for function main:
   0x00001199 <+0>: lea    0x4(%esp),%ecx
   0x0000119d <+4>: and    $0xfffffff0,%esp
   0x000011a0 <+7>: pushl  -0x4(%ecx)
   0x000011a3 <+10>:    push   %ebp
   0x000011a4 <+11>:    mov    %esp,%ebp
   0x000011a6 <+13>:    push   %ebx
   0x000011a7 <+14>:    push   %ecx
   0x000011a8 <+15>:    sub    $0x10,%esp
   0x000011ab <+18>:    call   0x10a0 <__x86.get_pc_thunk.bx>
   0x000011b0 <+23>:    add    $0x2e50,%ebx
   0x000011b6 <+29>:    movl   $0x0,-0xc(%ebp)
   0x000011bd <+36>:    jmp    0x11d8 <main+63>
   0x000011bf <+38>:    sub    $0x8,%esp
   0x000011c2 <+41>:    pushl  -0xc(%ebp)
   0x000011c5 <+44>:    lea    -0x1ff8(%ebx),%eax
   0x000011cb <+50>:    push   %eax
   0x000011cc <+51>:    call   0x1030 <printf@plt>
   0x000011d1 <+56>:    add    $0x10,%esp
   0x000011d4 <+59>:    addl   $0x1,-0xc(%ebp)
   0x000011d8 <+63>:    cmpl   $0xc7,-0xc(%ebp)
   0x000011df <+70>:    jle    0x11bf <main+38>
   0x000011e1 <+72>:    mov    $0x0,%eax
   0x000011e6 <+77>:    lea    -0x8(%ebp),%esp
   0x000011e9 <+80>:    pop    %ecx
   0x000011ea <+81>:    pop    %ebx
   0x000011eb <+82>:    pop    %ebp
   0x000011ec <+83>:    lea    -0x4(%ecx),%esp
   0x000011ef <+86>:    ret    
End of assembler dump.
(gdb) break *0x000011ef
Breakpoint 1 at 0x11ef
(gdb) run
Starting program: /root/test 

[1]+  Stopped                 gdb test

I tried to do the same thing in another linux machine, and it works fine. So what could be the problem?

Update: I found a temp solution for the breakpoints issue (so gdb do not crash), You use the command (start) at the beginning and everything will work fine :

GNU gdb (Debian 8.3-1) 8.3
Copyright (C) 2019 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-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
    <http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from test...
(No debugging symbols found in test)
(gdb) start
Temporary breakpoint 1 at 0x11a8
Starting program: /root/test 

Temporary breakpoint 1, 0x565561a8 in main ()
(gdb) enable
(gdb) disas main
Dump of assembler code for function main:
   0x56556199 <+0>: lea    0x4(%esp),%ecx
   0x5655619d <+4>: and    $0xfffffff0,%esp
   0x565561a0 <+7>: pushl  -0x4(%ecx)
   0x565561a3 <+10>:    push   %ebp
   0x565561a4 <+11>:    mov    %esp,%ebp
   0x565561a6 <+13>:    push   %ebx
   0x565561a7 <+14>:    push   %ecx
=> 0x565561a8 <+15>:    sub    $0x10,%esp
   0x565561ab <+18>:    call   0x565560a0 <__x86.get_pc_thunk.bx>
   0x565561b0 <+23>:    add    $0x2e50,%ebx
   0x565561b6 <+29>:    movl   $0x0,-0xc(%ebp)
   0x565561bd <+36>:    jmp    0x565561d8 <main+63>
   0x565561bf <+38>:    sub    $0x8,%esp
   0x565561c2 <+41>:    pushl  -0xc(%ebp)
   0x565561c5 <+44>:    lea    -0x1ff8(%ebx),%eax
   0x565561cb <+50>:    push   %eax
   0x565561cc <+51>:    call   0x56556030 <printf@plt>
   0x565561d1 <+56>:    add    $0x10,%esp
   0x565561d4 <+59>:    addl   $0x1,-0xc(%ebp)
   0x565561d8 <+63>:    cmpl   $0xc7,-0xc(%ebp)
   0x565561df <+70>:    jle    0x565561bf <main+38>
   0x565561e1 <+72>:    mov    $0x0,%eax
   0x565561e6 <+77>:    lea    -0x8(%ebp),%esp
   0x565561e9 <+80>:    pop    %ecx
   0x565561ea <+81>:    pop    %ebx
   0x565561eb <+82>:    pop    %ebp
   0x565561ec <+83>:    lea    -0x4(%ecx),%esp
   0x565561ef <+86>:    ret    
End of assembler dump.
(gdb) break *0x565561df
Breakpoint 2 at 0x565561df
(gdb) info break
Num     Type           Disp Enb Address    What
2       breakpoint     keep y   0x565561df <main+70>
(gdb) run
The program being debugged has been started already.
Start it from the beginning? (y or n) y
Starting program: /root/test 

Breakpoint 2, 0x565561df in main ()
(gdb) step
Single stepping until exit from function main,
which has no line number information.
0

Breakpoint 2, 0x565561df in main ()
(gdb) 
Single stepping until exit from function main,
which has no line number information.
1

Breakpoint 2, 0x565561df in main ()
(gdb) 
Single stepping until exit from function main,
which has no line number information.
2

Breakpoint 2, 0x565561df in main ()
(gdb) 
Single stepping until exit from function main,
which has no line number information.
3

Breakpoint 2, 0x565561df in main ()
(gdb) 
Single stepping until exit from function main,
which has no line number information.
4

Breakpoint 2, 0x565561df in main ()

Unfortunately, This is a temp solution just so you can deal with breakpoints, and it have nothing to do with the crashing problem.

crash
gdb
asked on Stack Overflow Sep 13, 2019 by Someone • edited Sep 16, 2019 by Someone

2 Answers

1

You are most likely trying to set a breakpoint at an invalid address with this command break *0x000011ef. The 0x11ef is the offset of that instruction within the section within the ELF, but the program is going to be relocated when it is loaded / started.

You should instead try start, then disas main, and then place your breakpoint.

GDB stopping like this is a bug which occurs when GDB throws an error while trying to place a breakpoint, it was fixed in upstream GDB with this patch:

https://sourceware.org/ml/gdb-patches/2019-05/msg00361.html

Once you see GDB stopped like this:

[1]+ Stopped gdb soQuestionProgram

you should be dropped back to a shell. Just resume GDB with the fg command and continue your debug session. Once GDB 8.4 is out this bug will be fixed.

answered on Stack Overflow Sep 16, 2019 by Andrew
0

it keeps acting like this

First: GDB did not crash. It merely got stopped (by your shell). You can get it back with the shell fg command.

Second: this has nothing to do with GDB, and something to do with your terminal configuration. Using reset may cure this problem.

answered on Stack Overflow Sep 14, 2019 by Employed Russian

User contributions licensed under CC BY-SA 3.0