https://blog.csdn.net/unix21/article/details/9991925
gdb可视化调试:gdb -tui -q 可执行文件的名字
1.gdb编译/启动/退出/传参/查看源代码
-
gdb编译程序
使用gcc编译程序生成可执行文件的命令中,加上-g参数 -
启动gdb调试程序
gdb 可执行程序 -
退出gdb调试
在gdb中输入quit(q) -
命令行传参
set args ___ ___ ___ -
gdb查看源代码:list(l)
[1] listsize显示设置
默认情况下,显示list的上下各10行
list showsize #执行l命令,默认显示几行
set listsize 20 #设置显示的行数为20
[2] list(l)的使用
list 文件名:行号
list 文件名:函数名
2.断点相关命令
-
设置断点:break(b)
b 文件名:行号
b 文件名:函数名 -
条件断点
b 行号 if 变量==var
例:b 17 if i==10 表示:在第17行打断点,当i==10条件成立时,程序停在断点处 -
查看设置过的断点info(i) b
-
删除断点:del(d) 断点编号Num
del num1 num2 … numN
del numK1-numK2 -
将断点设为[无效]:disable(dis) 断点编号Num
-
将断点设为[有效]:enable(ena) 断点编号Num
3.代码调试相关命令
-
启动并执行程序,停在程序的第一行:start
-
启动并执行程序,停在断点break处:run®
-
查看变量的值:print§ 变量
-
查看变量的类型:ptype 变量
-
在程序执行的过程中,实时自动地显示变量的值:dispaly i
取消实时自动地显示变量的值:
info(i) display
undisplay 编号Num
4. 常用调试
-
gdb -p {进程号}
① 根据进程名,获取进程号码:pidof {进程名} --> 进程号
② 开启gdb调试:gdb {进程号}
说明:gdb {进程号},会先杀死该进程,然后重启进程&进入gdb调试环境。 -
打断点技巧
(1) b {代码文件}:函数名,例: b test.c:main
(2) b {代码文件}:行号,例:b test.c 12 -
查看断点信息:info b
-
commands:命令列表 (依赖于断点)
每次断点发生时候,想要查看的变量很多时,如果每个变量都手动print则需要浪费很多时间。断点命令可以在断点发生时批量执行gdb命令。
commands的设置步骤
① 打断点
② commands(开启commands)
③ > 命令1
④ > 命令2
⑤ > end (结束commands)
(gdb) l
1 #include <stdio.h>
2
3 int main()
4 {
5 int i;
6 for(i=0;i<100;i++)
7 ;
8
9 }
10
(gdb) b 7 # 打断点
Breakpoint 1 at 0x4004c3: file main.c, line 7.
(gdb) i b # 查看断点信息
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004004c3 in main at main.c:7
(gdb) commands 1 # 开启commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>p i # commands中的命令行
>end # 结束commands
(gdb) i b # 查看断点详情,多了个p i
Num Type Disp Enb Address What
1 breakpoint keep y 0x00000000004004c3 in main at main.c:7
p i
(gdb)
- 监视器(某个变量发生变化时,将自动打印,
不依赖于断点
)
可以监视某个变量,在变量被访问或者被修改时程序会在当前点进入断点。
① start 先启动
② watch {要监视的变量}
向下走,程序停在下一个断点:continue©
向下走一步,不会进入函数体:next(n)
向下走一步,会进入函数体:step(s)
跳出函数体:finish
从循环体直接跳出:until