一、背景
程序的发布方式有两种,debug模式 和release模式。
Linux中gcc/g++出来的二进制程序,默认是release模式。
要使用gdb调试,必须在gcc/g++编译的时候加上**-g**选项。例如:gcc编译test.c文件生成test可执行程序。
cpp
gcc -o test test.c -g
二、gdb的基础用法和相关选项
对于可执行文件test而言。
2.1 进入调试模式指令
gdb test
cpp
[xxl@VM-0-2-centos test]$ gdb test
GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7
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-redhat-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /home/xxl/test/test...done.
(gdb) //调试输入指令位置
2.2 退出调试模式指令
(gdb) quit
或者Ctrl+D
cpp
(gdb) quit
[xxl@VM-0-2-centos test]$
gdb会记住最近的一条指令,在不输入指令时会自动执行最近的一条指令。
2.3 显示原代码指令
(gdb) l 数字n或函数名
(gdb) list / l 行号 :显示第n行以及n行上下几行的一段代码。(gdb) list / l 函数名 :从函数所在位置的10行代码。
cpp
(gdb) l main
2 int Add(int x,int y)
3 {
4 return x+y;
5 }
6 int main()
7 {
8 int a=10;
9 int b=20;
10 printf("%d\n",Add(a,b));
11 return 0;
2.4 断点相关指令
(gdb) break(b) 行号 :在某一行设置断点。
(gdb) break(b) 函数名 :在某个函数开头位置设置断点。
(gdb) break(b) 文件名:行号(函数名):在某个文件的某行或某个函数开头位置设置断点。
(gdb) info break(b) :查看断点信息。
cpp
(gdb) b 5
Breakpoint 1 at 0x40053f: file test.c, line 5.
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0x000000000040053f in Add at test.c:5
Num代表断点的编号。
Type表示是一个断点。
Enb代表断点是否开启。
Address代表断点的地址。
What代表断点的位置。
删除断点需要根据断点的编号才能正确的删除断点。
(gdb) delete(d) 断点编号 :根据断点编号删除断点。
(gdb) continue(c) :从一个断点跳到下一个断点。
(gdb) disable 断点编号 :根据断点编号关闭相应的断点。
(gdb) enable 断点编号 :根据断点编号开启相应的断点。
2.5 调试相关指令
(gdb) r:开始调试。
(gdb) next(n) :逐过程进行调试(不进入函数内部,类似VS中的F10)。
(gdb) step(s) :逐语句进行调试(进入函数内部,类似VS中的F11)。
(gdb) until 行数n :直接跳到第n行。
(gdb) finish:直接运行完当前的函数。
2.6 变量相关指令
(gdb) p 变量名 :查看变量。
(gdb) p 变量地址 :查看变量地址。
(gdb) display 变量 :一直显示变量。
(gdb) undisplay 变量编号 :关闭对应编号变量的显示。
(gdb) info locals :查看main函数的本地变量。
cpp
(gdb) display a //一直显示变量a
1: a = 0
(gdb) undisplay 1 //关闭变量a的显示
2.7 其他指令
(gdb) breaktrace(bt) :查看调用堆栈。