Longstick的学习周记——第五周

目录

前言

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

其他的基本命令可以参考查询:
https://blog.csdn.net/niyaozuozuihao/article/details/91802994?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162651052816780274160084%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=162651052816780274160084&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-91802994.first_rank_v2_pc_rank_v29&utm_term=gdb&spm=1018.2226.3001.4187

二、 多文件调试

这个方面网上的资料比较少一些,大概思考了一下,其实多文件工程也是对主函数文件设置断点,比如在调用其他文件的函数func打上断点,通过一步step就可以进入其他文件中并进行调试。使用起来大致上其实与单文件差不多。

其中,多文件调试会遇到的函数同名问题,可以参考:https://blog.csdn.net/wwcqhh/article/details/103043795

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值