GDB
GNU Debugger (GDB)
Compiling
Compile the code with symbolic debugging information included, gcc with -g switch.
$ gcc -g hello.c -o hello
$ g++ -g hello.cpp -o hello
$ gcc -g hello.c -o hello
$ gdb hello
GNU gdb (GDB) Fedora (6.8.50.20090302-21.fc11)
Copyright (C) 2009 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 "i586-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
(gdb) r
Starting program: /home/Deepak/Documents/hello
Hello World
Program exited normally.
Missing separate debuginfos, use: debuginfo-install glibc-2.10.1-2.i686
(gdb)
(gdb) q
$
Start in GUI mode using gdb -tui
$ gdb -tui hello
┌──hello.c──────────────────────────────────────────────────────────────────┐
│1 #include<stdio.h> │
│2 │
│3 int main() │
│4 { │
B+>│5 printf("Hello World \n"); │
│6 return 0; │
│7 } │
│8 │
│9 │
│10 │
│11 │
│12 │
│13 │
└───────────────────────────────────────────────────────────────────────────┘
child process 4492 In: main Line: 5 PC: 0x80483bd
(gdb) list hello.c:1
(gdb) break hello.c:5
Breakpoint 1 at 0x80483bd: file hello.c, line 5.
(gdb) r
Starting program: /home/Deepak/Documents/hello
Breakpoint 1, main () at hello.c:5
(gdb)
Now, notice that we passed the name of the executable on the command line. Another option you have is to just start gdb with nothing else on the command line, then give it the command file hello, and that will cause the executable "hello" to be loaded up.
Command line arguments!
(gdb) run arg1 arg2
First, before you issue the run command, you need to set a breakpoint someplace you'd like to stop. You use the break or b command, and specify a location, which can be a function name, a line number, or a source file and line number.
If you're running in dumb terminal mode, gdb will print the line it will execute next. If you're running in cool GUI mode, the line it will execute next will be highlighted in the source window.
break main
break 5
break hello.c:5
Break at the beginning of the main() function
Break at line 5 of the current file
Break at line 5 of hello.c
To list the current breakpoints, use the info command, like so: "info breakpoints" (or the shorter "i b"):
To clear a breakpoint, use the clear command with the breakpoint location. You can also clear a breakpoint by number with the delete command.
Additionally, you can enable or disable breakpoints, though these two commands take a breakpoint number as an argument, not a location! The enabled/disabled status of a breakpoint is visible under the "Enb" column in the breakpoint listing.
# gdb hello
GNU gdb (GDB) Fedora (6.8.50.20090302-21.fc11)
Copyright (C) 2009 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 "i586-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
(gdb) b main
Breakpoint 1 at 0x80483bd: file hello.c, line 5.
(gdb) b hello.c:6
Breakpoint 2 at 0x80483c9: file hello.c, line 6.
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep y 0x080483bd in main at hello.c:5
2 breakpoint keep y 0x080483c9 in main at hello.c:6
(gdb) disable 1
(gdb) i b
Num Type Disp Enb Address What
1 breakpoint keep n 0x080483bd in main at hello.c:5
2 breakpoint keep y 0x080483c9 in main at hello.c:6
(gdb) clear main
Deleted breakpoint 1
(gdb) i b
Num Type Disp Enb Address What
2 breakpoint keep y 0x080483c9 in main at hello.c:6
(gdb) delete 2
(gdb) i b
No breakpoints or watchpoints.
(gdb) delete 1
No breakpoint number 1.
Core Dump Analysis
info thread
Thread n (switch to nth thread)
$ gcc -g hello.c -o hello
$ ./hello
Segmentation fault
$ ulimit -c unlimited
$ ./hello
Segmentation fault (core dumped)
$ dir
core.2568 hello hello.c
$ gdb hello core.2568
GNU gdb (GDB) Fedora (6.8.50.20090302-21.fc11)
Copyright (C) 2009 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 "i586-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
warning: Can't read pathname for load map: Input/output error.
Reading symbols from /lib/libc-2.10.1.so...Reading symbols from /usr/lib/debug/lib/libc-2.10.1.so.debug...done.
done.
Loaded symbols for /lib/libc-2.10.1.so
Reading symbols from /lib/ld-2.10.1.so...Reading symbols from /usr/lib/debug/lib/ld-2.10.1.so.debug...done.
done.
Loaded symbols for /lib/ld-2.10.1.so
Core was generated by `./hello'.
Program terminated with signal 11, Segmentation fault.
#0 0x080483d9 in main () at hello.c:6
6 *ptr = 1234;
(gdb) bt
#0 0x080483d9 in main () at hello.c:6
(gdb) info registers
eax 0x0 0
ecx 0x77fee063 2013192291
edx 0x1 1
ebx 0xa81ff4 11018228
esp 0xbfb81f30 0xbfb81f30
ebp 0xbfb81f58 0xbfb81f58
esi 0x0 0
edi 0x0 0
eip 0x80483d9 0x80483d9 <main+21>
eflags 0x210286 [ PF SF IF RF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
(gdb) info all-registers
eax 0x0 0
ecx 0x77fee063 2013192291
edx 0x1 1
ebx 0xa81ff4 11018228
esp 0xbfb81f30 0xbfb81f30
ebp 0xbfb81f58 0xbfb81f58
esi 0x0 0
edi 0x0 0
eip 0x80483d9 0x80483d9 <main+21>
eflags 0x210286 [ PF SF IF RF ID ]
cs 0x73 115
ss 0x7b 123
ds 0x7b 123
es 0x7b 123
fs 0x0 0
gs 0x33 51
st0 0 (raw 0x00000000000000000000)
st1 0 (raw 0x00000000000000000000)
st2 0 (raw 0x00000000000000000000)
st3 0 (raw 0x00000000000000000000)
st4 0 (raw 0x00000000000000000000)
st5 0 (raw 0x00000000000000000000)
st6 0 (raw 0x00000000000000000000)
---Type <return> to continue, or q <return> to quit---
st7 0 (raw 0x00000000000000000000)
fctrl 0x0 0
fstat 0x0 0
ftag 0x0 0
fiseg 0x0 0
fioff 0x0 0
foseg 0x0 0
fooff 0x0 0
fop 0x0 0
xmm0 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0},
v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0},
uint128 = 0x00000000000000000000000000000000}
xmm1 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0},
v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0},
uint128 = 0x00000000000000000000000000000000}
xmm2 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0},
v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0}, v4_int32 = {0x0, 0x0, 0x0, 0x0}, v2_int64 = {0x0, 0x0},
uint128 = 0x00000000000000000000000000000000}
xmm3 {v4_float = {0x0, 0x0, 0x0, 0x0}, v2_double = {0x0, 0x0},
v16_int8 = {0x0 <repeats 16 times>}, v8_int16 = {0x0, 0x0, 0x0, 0x0, 0x0,
---Type <return> to continue, or q <return> to quit---q
0x0,Quit
(gdb) bt
#0 0x080483d9 in main () at hello.c:6
(gdb) backtrace
#0 0x080483d9 in main () at hello.c:6
(gdb)