GDB调试利器-单步调试与查看变量
前言
前面两篇已经对Linux下如何使用gdb启动调试,GDB调试利器-断点设置与查看源码我们已经了解了GDB基本的启动调试,设置断点,查看源码等,如果这些内容你还不知道,建议先回顾一下前面的内容。
断点附近的代码你了解后,这时候你就可以使用单步执行一条一条语句的去执行。可以随时查看执行后的结果。接下来你可能会想知道程序运行的一些情况,就需要查看变量的值。下面介绍单步调试与设置变量。
单步调试
居然是调试代码,还是老规矩,先上代码:
//test.c
#include <stdio.h>void judge_sd(int num){if ((num & 1) == 0){printf("%d is even\n",num);return;}else{printf("%d is odd\n",num);return;}
}int main(int argc, char const *argv[]){judge_sd(0);judge_sd(1);judge_sd(4);return 0;
}
编译:
gcc -g test.c -o test
程序的功能比较简单,这里不多做解释。断点附近的代码你了解后,这时候你就可以使用单步执行一条一条语句的去执行。可以随时查看执行后的结果。单步执行有两个命令,分别是step和next。我们可能打了多处断点,或者断点打在循环内,这个时候,可以使用continue命令。这三个命令的区别在于:
1、next命令(可简写为n)用于在程序断住后,继续执行下一条语句。
2、step命令(可简写为s),它可以单步跟踪到函数内部。
3、continue命令(可简写为c)或者fg,它会继续执行程序,直到再次遇到断点处。
单步进入-step
step 一条语句一条语句的执行。它有一个别名,s。它可以单步跟踪到函数内部。
先用list(可简写为l)将源码列出来,例如:
先启动调试,然后把源码列出来。
从上面的过程可以看到,在5行设置断点,运行程序,可见,step命令进入到了被调用函数中judge_sd。使用step命令也会在这个方法中一行一行的单步执行。但是如果没有该函数源码,需要跳过该函数执行,可使用finish命令,继续后面的执行。
单步执行-next
next命令示例:
next命令(可简写为n)用于在程序断住后,继续执行下一条语句。上面的信息在5行处打断点,然后运行到6行,然后输入 运行n 2,则会单步执行两行。可见,使用next命令只会在本方法中单步执行。
继续执行到下一个断点-continue
我们可能打了多处断点,或者断点打在循环内,这个时候,想跳过这个断点,甚至跳过多次断点继续执行该怎么做呢?可以使用continue命令。它的作用就是从暂停处继续执行。命令的简写形式为c。继续执行过程中遇到断点或者观察点变化依然会暂停。示例代码如下:
跳过执行–skip
根据上面的信息可以看到,使用skip之后,将不会进入judge_sd函数。好处就是skip可以在step时跳过一些不想关注的函数或者某个文件。
如果想删除skip,使用skip delete [num] 。
查看变量
现在你已经会设置断点,查看断点附近的代码,并可以单步执行和继续执行。接下来你可能会想知道程序运行的一些情况,如查看变量的值。print命令正好满足了你的需求。以帮助我们进一步定位问题。
格式:
print[变量名]
print(可简写为p)打印变量内容。示例代码如下:
//test.c
#include <stdio.h>
#include <stdlib.h> //malloc,free,randint main(int argc, char const *argv[])
{int input;int i ;printf("Please enter the length of the string:");scanf("%d",&input);char *buf = (char *) malloc(input + 1);//字符最后包含'\0'if (buf == NULL){printf("malloc failed!\n");return -1;}//随机生成字符串for ( i = 0; i < input; i++){buf[i] = rand()%26 +'a';}buf[i] = '\0';printf("A randomly generated string: %s\n",buf);free(buf);return 0;
}
编译:
gcc -g test.c -o test
先用list(可简写为l)将源码列出来,例如:
print命令的简写形式为p,使用它打印出变量的值。
打印出的变量i的值为80。
当然,多个函数或者多个文件会有同一个变量名,这个时候可以在前面加上文件名或者函数名来区分:
p 'testfile.c'::i
p 'sum'::i
在看看指针。
注意到了没有,如果使用上面的方式打印指针指向的内容,那么打印出来的只是指针地址而已。那怎么打印出指针指向的内容呢?
需要解引用,如下:
仅仅使用*只能打印第一个值,如果要打印多个值,后面跟上@并加上要打印的长度。
或者@后面跟上变量值:如下:
另外值得一提的是,$可表示上一个变量,在调试链表时时经常会用到的,它有next成员代表下一个节点,则可使用下面方式不断打印链表内容,举例:
p *linkNode #这里显示linkNode节点内容
p *$.next #这里显示linkNode节点下一个节点的内容
设置变量
使用print命令查看了变量的值,如果感觉这个值不符合预期,想修改下这个值,再看下执行效果。这种情况下,我们该怎么办呢?通常情况下,我们会修改代码,再重新执行代码。使用gdb的set命令,一切将变得更简单。
set命令可以直接修改变量的值。
设置观察点
设置观察点的作用就是:当被观察的变量发生变化后,程序就会暂停执行,并把变量的原值(Old)和新值(New)都会显示出来。设置观察点的命令是watch。
watch num
这个时候,让程序继续运行,如果num的值发生变化,则会打印相关内容,如:
Hardware watchpoint 3: num
Old value = 1
New value = 10
总结
通过上面的例子演示,我相信读者已经对于通过GDB调试C/C++程序有了基本的理解,如果你想获取更多的调试技巧请参考官方网站的GDB调试手册,还有GDB官方网站的手册。
参考:GDB TutorialA Walkthrough with Examples
(微信公众号【程序猿编码】)
(添加本人微信号,备注加群,进入程序猿编码交流群,回复:领取学习资料,获取每日干货)
欢迎关注 微信公众号【程序猿编码】,专注于Linux c/c++ 、Python、Go语言、数据结构与算法、网络编程相关知识,常用的程序员工具。还有每日00:10分之前更新 新闻简报,一份【简报】,纵览天下事!
GDB调试利器-单步调试与查看变量相关推荐
- codeblocks调试问题--单步调试遇到breakpoint不停---不能单步调试--运行按钮是灰色但是没有dos窗口...
今天晚上调试的时候可能不小心改了设置,还是其它原因,codeblocks突然遇到breakpoint不停了,然后百度了一下,大部分是说project创建的问题,感觉和自己的问题不同,我的问题是所有的p ...
- GDB调试指南-单步调试
前言 前面通过<启动调试>,<断点设置>,<变量查看>,我们已经了解了GDB基本的启动,设置断点,查看变量等,如果这些内容你还不知道,建议先回顾一下前面的内容.在启 ...
- await 单步调试 c#_GDB调试指南-单步调试
前言 前面通过<启动调试>,<断点设置>,<变量查看>,我们已经了解了GDB基本的启动,设置断点,查看变量等,如果这些内容你还不知道,建议先回顾一下前面的内容.在启 ...
- python逐行调试_python单步调试
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文由腾讯云+社区自动同步,原文地址 https:stackoverflow.c ...
- DEV-C++调试查看变量
先将程序编译过,点击调试却出现这种情况 这时候我们点击工具->编译选项->代码生成/优化->连接器->产生调试信息,将no改成yes,就OK了 调试的时候在合适的地方设置断点, ...
- 调试多线程 查死锁的bug gcore命令 gdb对多线程的调试 gcore pstack 调试常用命令...
gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...
- 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
文章目录 一.ptrace 函数族 1.进程附着 2.进程脱离 3.进程数据读写权限 4.进程对应的主线程寄存器读写 5.单步调试 6.继续向后执行 二.ptrace 函数族状态转换 一.ptrace ...
- gdb如何确定内存 已经释放_很经典的GDB调试命令,包括查看变量,查看内存
转载地址:http://www.cnblogs.com/rosesmall/archive/2012/04/12/2444431.html PS:如果想跟踪正在运行的进程可以: ps 查看进程id . ...
- 微信小程序里面的单步调试和变量查看
在微信小程序开始学习与开发的过程中,总有一些东西,想看看它跑起来的内容与我们编程时想的是否一致,于是就想到了能不能单步调试或者打出一些我们想要的变量的内容,以便我们做进一步的开发和调整,现在我就要介绍 ...
最新文章
- vue.js仿饿了么app---webpack配置项
- 渲染测试软件 d15,D5 Render(D5 渲染器)1.7.0 正式版发布 | 一款 RTX 实时光线追踪可视化实时渲染引擎,而且是国产软件!...
- 简述python的特性_python的一些语言特性(一)
- markdown 编辑器_Markdown 编辑器使用指南
- 结束 txt进程_Python多进程抓取拉钩网十万数据
- 分享3个数据分析实战项目(附最新资料包)
- 阿里 8.6 亿美元再押 ofo,与摩拜合并再无可能?
- 关于Android屏幕适配
- angular源码分析 摘抄 王大鹏 博客 directive指令及系列
- web 开发生产率_11种可帮助Web开发人员克服最后期限的生产力工具
- Intellij IDEA设置类的文件头注释(@Author)(一)
- 国密(3)- 预主密钥/主密钥计算和Finished消息的加解密
- C++:求整数num中包含因子k的个数
- 管理储备与应急储备的区别--建群网培PMP
- 大连民族大学计算机学院许淑娟,大连民族大学计算机科学与工程学院2017年教师元旦联欢会圆满落幕...
- 单据打印处理,自动缩小字体,自动换行
- uni-app页面跳转问题
- 流程控制之python
- 【C#】Form窗体
- P3853 [TJOI2007]路标设置(二分答案)
热门文章
- 【Ue4卡通渲染描边方案】平均法线存入切线的改进算法——O(n)时间复杂度
- 开发版安装harmonyos,HarmonyOS | 小熊派鸿蒙开发板初体验
- 高校圆桌派-第二期话题征集等你来
- html css中文字段落间距怎么设置,[HTML/CSS应用]博客文档排版之设置合适的行间距与段间距...
- Kickstarter | 什么反重力科技上线仅一小时获千粉
- Linux删除不了受损文件,使用错误的文件名Linux删除损坏的文件
- Go-lang分布式框架选择上的历程记录【go-micro、go-zero、go-kratos】
- 搭建kali和win xp靶机实验环境
- 数据结构课程设计--立体停车场管理系统(改)
- 1.6万亿参数你怕了吗?谷歌大脑发布语言模型 Switch Transformer,速度碾压T5