生成带有调试信息的可执行文件
参数 | 作用 |
---|---|
-g(必须添加) | 生成调试信息 |
-O(选填) | 关闭编译器优化选项 |
-Wall(选填) | 打开所有warming,可以尽量避免不必要的bug |
生成带有调试信息的xxx可执行文件
gcc xxx.c -g -o xxx
//如果为cpp文件则将命令改为g++即可
启动gdb
打开gdb调试
gdb xxx //此时只是打开了gdb调试,并没有真正开始执行
启动gdb后的可选命令
命令 | 作用 |
---|---|
s(start) | 从程序的开头调试程序 (只能执行一次) |
r(run) | 存在断点的话则从断点处开始调试程序(只能执行一次) |
c(continue) | 执行下一步程序 |
q(quiit) | 退出gdb调试 |
显示文件信息
切换文件
设置显示行数
(gdb)set list(listsize) 20//设置为显示20行
设置/查看断点
命令 | 作用 |
---|---|
b(break)+行号 | 在当前文件下行号处设置断点 |
b(break)+函数名 | 在当前文件下函数名处设置断点 |
b(break)+文件名:行号 | 在指定文件下行号处设置断点 |
b(break)+文件名:函数名 | 在指定文件下函数名处设置断点 |
b(break)+行号+if 变量名==某个值 (条件断点) | 当变量满足某个值时程序停在该行号处(通常情况下在循环中条件断点用的多) |
i b/info break | 查看设置的断点 |
查看断点举例
删除断点/设置断点状态
指令 | 作用 |
---|---|
d(delete)+行号/num1-numN | 删除指定行号/指定范围处断点 |
dis(disable)+行号/num1-numN | 设置指定行号/指定范围断点无效 |
ena(enable)+行号/num1-numN | 设置指定行号/指定范围断点有效 |
显示变量信息
(gdb)p 变量名
(gdb)p/xxx 变量名 //以/xxx格式输出 格式表参考下图
格式表
打印变量类型
(gdb)ptype 变量名
自动跟踪变量值
(gdb)display 变量名
(gdb)display/xxx 变量名 //以/xxx格式输出 格式表参考下图
(gdb)info display //显示跟踪了哪些变量,可以得到变量编号
(gdb)undisplay num/num1-numN //删除自动跟踪的变量
(gdb)disable display num //禁用跟踪变量值
(gdb)enable display num //激活跟踪变量值
单步调试
(gdb)step (遇到函数体会进入)
(gdb)next(跳过函数体)
(gdb)finish(从函数体内部跳出,函数内部不能有断点,若有断点
需要删除断点)
(gdb)until(跳出循环体,循环内部不能有断点)
设置变量
set var xxx=xxx //可以用来跳出循环