目录
前言
gdb的学习使用
一、基本调试步骤
1. 编译程序
2. 运行程序
3. 查看源码
4. 运行程序
5. 设置断点
6. 单步执行
7. 查看变量
8. 退出gdb
二、 多文件调试
前言
期末考试终于算是告一段落了,算了简单放松了一段时间。虽然但是,紧张的学习生活没有结束哈,项目这边开始布置任务下来,打断了我养神(睡懒觉)的节奏。
好吧,人还是要努力,我是不配躺平的。
一边要求继续学习react、python和reportlab,一边是下周五要分享gdb的调试使用;得。啥也不会,从头来过呗。
gdb这边比较着急,总结一下把。
gdb的学习使用
gdb说是非常陌生好像倒也不是,我总是觉得这个玩意儿的名字相当眼熟啊。仔细想了想,原来是之前配置vscode的C++调试用的就是这个调试器,行吧。
这次是放在linux环境下进行操作,对于命令行的使用是需要了解一下的。然后老师这边的要求是对多个C++文件的工程进行调试,断点调试以及变量表达式的打印。
一、基本调试步骤
1. 编译程序
gcc -g test.c -o test
需要注意的是,这个地方的-g参数不能少,生成可调试文件必须使用-g参数。
2. 运行程序
gdb test
gdb -q test //表示不打印gdb版本信息,界面较为干净;
此时进入了gdb之后,命令行开头会有 (gdb) 的字样。
3. 查看源码
(gdb) list //简写为l
查看源程序的代码,默认显示十行,可以通过回车键来查看余下代码。
4. 运行程序
(gdb) run //简写为r
运行程序直到遇到结束或者断点等待下一命令。
5. 设置断点
(gdb) break 5 //简写为b,参数为行号,在某行设置断点
Breakpoint 3 at 0x400836: file write.c, line 5.
(gdb) info breakpoints //查看断点信息
Num Type Disp Enb Address What
3 breakpoint keep y 0x0000000000400836 in main at write.c:5
4 breakpoint keep y 0x00000000004008a6 in main at write.c:26
5 breakpoint keep y 0x00000000004008c6 in main at write.c:30
//Num 编号
//Disp 断点执行后是否有效 kep: 有效 dis: 无效
//Enb 当前断点是否有效 y:有效 n:无效
//Address 内存地址
//what 位置
6. 单步执行
(gdb) r
Starting program: /home/eit/c_test/test
Breakpoint 3, main () at write.c:12
12 {
(gdb) n //next,简写为n,下一步
14 char *buf = "helo!I'm liujiangyong ";
(gdb) //此时回车表示下一步
16 len = strlen(buf);
(gdb)
17 fd = open("/home/hello.txt",O_CREAT | O_TRUNC | O_RDWR,0666);
(gdb) s //step,简写为s,单步调试
open64 () at ../sysdeps/unix/syscall-template.S:81
81 ../sysdeps/unix/syscall-template.S: No such file or directory.
(gdb) //此时回车表示单步调试
main () at write.c:18
18 if (fd<0)
(gdb)
25 printf("open file:hello.txt %d\n",fd);
(gdb)
__printf (format=0x400a26 "open file:hello.txt %d\n") at printf.c:28
28 printf.c: No such file or directory.
(gdb) c //continue,简写为c,表示继续运行后面的程序
Continuing.
open file:hello.txt 3
7. 查看变量
(gdb) print var //查询值
$10 = 3
(gdb) whatis var //查询类型
type = int
8. 退出gdb
(gdb) quit //简写为q,退出gdb
二、 多文件调试
这个方面网上的资料比较少一些,大概思考了一下,其实多文件工程也是对主函数文件设置断点,比如在调用其他文件的函数func打上断点,通过一步step就可以进入其他文件中并进行调试。使用起来大致上其实与单文件差不多。
其中,多文件调试会遇到的函数同名问题,可以参考:https://blog.csdn.net/wwcqhh/article/details/103043795