目录
GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具。 一般来说,GDB主要帮助你完成下面四个方面的功能:

- Here are some of the most frequently needed GDB commands:
- break [file:]function
- Set a breakpoint at function (in file).断点
- run [arglist]
- Start your program (with arglist, if specified).
- bt Backtrace: display the program stack.显示程序堆栈
- print expr
- Display the value of an expression.打印
- c Continue running your program (after stopping, e.g. at a
- breakpoint).继续
- next
- Execute next program line (after stopping); step over any function
- calls in the line.下一句
- edit [file:]function 查看当前停止的程序行。
- look at the program line where it is presently stopped.
-
- list [file:]function 键入程序的文本当程序停止了的位置
- type the text of the program in the vicinity of where it is
- presently stopped.
-
- step
- Execute next program line (after stopping); step into any function
- calls in the line. 执行下一行
-
- help [name]
- Show information about GDB command name, or general information
- about using GDB.
-
- quit
- Exit from GDB.
-
-
- You can, instead, specify a process ID as a second argument or use option "-p", if you want to debug a running process:
-
- gdb program 1234
- gdb -p 1234
示例
- linux@linux:~/Desktop$ ls
- a.out gdb.c
- linux@linux:~/Desktop$ gcc -g gdb.c
- linux@linux:~/Desktop$ ./a.out
- 0
- 1
- 2
- 3
- 4
- hello world
- linux@linux:~/Desktop$ gdb a.out
- GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
- Copyright (C) 2014 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 "i686-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 a.out...done.
- (gdb) l
- 2
- 3 void print()
- 4 {
- 5 printf("hello world\n");
- 6 }
- 7 int main(int argc, const char *argv[])
- 8 {
- 9 int i;
- 10
- 11 for (i = 0; i < 5; i++)
- (gdb) b main
- Breakpoint 1 at 0x804846a: file gdb.c, line 11.
- (gdb) r
- Starting program: /home/linux/Desktop/a.out
-
- Breakpoint 1, main (argc=1, argv=0xbffff164) at gdb.c:11
- 11 for (i = 0; i < 5; i++)
- (gdb) c
- Continuing.
- 0
- 1
- 2
- 3
- 4
- hello world
- [Inferior 1 (process 5010) exited normally]
- (gdb) b 10
- Note: breakpoint 1 also set at pc 0x804846a.
- Breakpoint 2 at 0x804846a: file gdb.c, line 10.
- (gdb) r
- Starting program: /home/linux/Desktop/a.out
-
- Breakpoint 1, main (argc=1, argv=0xbffff164) at gdb.c:11
- 11 for (i = 0; i < 5; i++)
- (gdb) c
- Continuing.
- 0
- 1
- 2
- 3
- 4
- hello world
- [Inferior 1 (process 5113) exited normally]
- (gdb) r
- Starting program: /home/linux/Desktop/a.out
-
- Breakpoint 1, main (argc=1, argv=0xbffff164) at gdb.c:11
- 11 for (i = 0; i < 5; i++)
- (gdb) n
- 12 printf("%d\n",i);
- (gdb) n
- 0
- 11 for (i = 0; i < 5; i++)
- (gdb) n
- 12 printf("%d\n",i);
- (gdb) n
- 1
- 11 for (i = 0; i < 5; i++)
- (gdb) p &i
- $1 = (int *) 0xbffff0bc
- (gdb) p i
- $2 = 1
- (gdb) n
- 12 printf("%d\n",i);
- (gdb) p i
- $3 = 2
- (gdb) n
- 2
- 11 for (i = 0; i < 5; i++)
- (gdb) n
- 12 printf("%d\n",i);
- (gdb) n
- 3
- 11 for (i = 0; i < 5; i++)
- (gdb) n
- 12 printf("%d\n",i);
- (gdb) p i
- $4 = 4
- (gdb) n
- 4
- 11 for (i = 0; i < 5; i++)
- (gdb) n
- 14 print();
- (gdb) s
- print () at gdb.c:5
- 5 printf("hello world\n");
- (gdb) n
- hello world
- 6 }
- (gdb) n
- main (argc=1, argv=0xbffff164) at gdb.c:15
- 15 return 0;
- (gdb)
示例:定位错误
代码
- #include
-
- #ifndef _CORE_
-
- void print()
- {
- printf("hello world\n");
- }
- int main(int argc, const char *argv[])
- {
- int i;
-
- for (i = 0; i < 5; i++)
- printf("%d\n",i);
-
- print();
- return 0;
- }
-
- #else
- int main(int argc,const char *argv[])
- {
- int *temp = NULL;
- *temp = 10; //没有分配内存空间,直接会出错
- return 0;
- }
-
- #endif
定位错误位置
- linux@linux:~/Desktop$ ls
- a.out gdb.c
- linux@linux:~/Desktop$ gcc -g gdb.c -D _CORE_
- linux@linux:~/Desktop$ ./a.out
- Segmentation fault (core dumped)
- linux@linux:~/Desktop$ ls
- a.out core gdb.c
- linux@linux:~/Desktop$ gdb a.out core
- GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
- Copyright (C) 2014 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 "i686-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 a.out...done.
- [New LWP 5904]
- Core was generated by `./a.out'.
- Program terminated with signal SIGSEGV, Segmentation fault.
- #0 0x080483fd in main (argc=1, argv=0xbfea3544) at gdb.c:24
- 24 *temp = 10; //没有分配内存空间,直接会出错
- (gdb)
如何调试正在运行的进程?

源码
- linux@linux:~/Desktop$ cat gdb.c
- #include
- #include
-
- int main(int argc, const char *argv[])
- {
- while(1)
- {
- int i;
- i++;
- printf("%d\n",i);
- sleep(1);
- }
- return 0;
- }
-
- linux@linux:~/Desktop$ gcc -g gdb.c
- linux@linux:~/Desktop$ ./a.out
- -1217503231
- -1217503230
- -1217503229
- -1217503228
-
- ...
再开一个终端
- linux@linux:~$ ps aux | grep a.out
- linux 6291 0.0 0.0 2028 280 pts/0 S+ 11:47 0:00 ./a.out
- linux 6293 0.0 0.0 4680 832 pts/3 S+ 11:47 0:00 grep --color=auto a.out
- linux@linux:~$ cd /home/linux/
- .bakvim/ .gconf/ .sogouinput/
- .cache/ .local/ Templates/
- .config/ .mozilla/ tftpboot/
- .dbus/ Music/ Videos/
- Desktop/ Pictures/ .vim/
- Documents/ .pki/ vmware-tools-distrib/
- Downloads/ Public/
- linux@linux:~$ cd /home/linux/Desktop/
- linux@linux:~/Desktop$ ls
- a.out core gdb.c
- linux@linux:~/Desktop$ gdb a.out -p 4849
- GNU gdb (Ubuntu 7.7-0ubuntu3.1) 7.7
- Copyright (C) 2014 Free Software Foundation, Inc.
- License GPLv3+: GNU GPL version 3 or later
//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 "i686-linux-gnu".
- Type "show configuration" for configuration details.
- For bug reporting instructions, please see:
//www.gnu.org/software/gdb/bugs/>. - Find the GDB manual and other documentation resources online at:
//www.gnu.org/software/gdb/documentation/>. - For help, type "help".
- Type "apropos word" to search for commands related to "word"...
- Reading symbols from a.out...done.
- Attaching to program: /home/linux/Desktop/a.out, process 4849
-
- warning: unable to open /proc file '/proc/4849/status'
-
- warning: unable to open /proc file '/proc/4849/status'
- ptrace: No such process.
- (gdb) b main
- Breakpoint 1 at 0x8048456: file gdb.c, line 9.
- (gdb) n
- The program is not being run.
- (gdb) r
- Starting program: /home/linux/Desktop/a.out
-
- Breakpoint 1, main (argc=1, argv=0xbffff0f4) at gdb.c:9
- 9 i++;
- (gdb) n
- 10 printf("%d\n",i);
- (gdb) n
- -1208209407
- 11 sleep(1);
- (gdb) n
- 12 }
- (gdb) q
- A debugging session is active.
-
- Inferior 1 [process 6317] will be killed.
-
- Quit anyway? (y or n) y
- linux@linux:~/Desktop$