前言

前面两篇已经对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调试利器-单步调试与查看变量相关推荐

  1. codeblocks调试问题--单步调试遇到breakpoint不停---不能单步调试--运行按钮是灰色但是没有dos窗口...

    今天晚上调试的时候可能不小心改了设置,还是其它原因,codeblocks突然遇到breakpoint不停了,然后百度了一下,大部分是说project创建的问题,感觉和自己的问题不同,我的问题是所有的p ...

  2. GDB调试指南-单步调试

    前言 前面通过<启动调试>,<断点设置>,<变量查看>,我们已经了解了GDB基本的启动,设置断点,查看变量等,如果这些内容你还不知道,建议先回顾一下前面的内容.在启 ...

  3. await 单步调试 c#_GDB调试指南-单步调试

    前言 前面通过<启动调试>,<断点设置>,<变量查看>,我们已经了解了GDB基本的启动,设置断点,查看变量等,如果这些内容你还不知道,建议先回顾一下前面的内容.在启 ...

  4. python逐行调试_python单步调试

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 本文由腾讯云+社区自动同步,原文地址 https:stackoverflow.c ...

  5. DEV-C++调试查看变量

    先将程序编译过,点击调试却出现这种情况 这时候我们点击工具->编译选项->代码生成/优化->连接器->产生调试信息,将no改成yes,就OK了 调试的时候在合适的地方设置断点, ...

  6. 调试多线程 查死锁的bug gcore命令 gdb对多线程的调试 gcore pstack 调试常用命令...

    gdb thread apply all bt 如果你发现有那么几个栈停在 pthread_wait 或者类似调用上,大致就可以得出结论:就是它们几个儿女情长,耽误了整个进程. 注意gdb的版本要高于 ...

  7. 【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )

    文章目录 一.ptrace 函数族 1.进程附着 2.进程脱离 3.进程数据读写权限 4.进程对应的主线程寄存器读写 5.单步调试 6.继续向后执行 二.ptrace 函数族状态转换 一.ptrace ...

  8. gdb如何确定内存 已经释放_很经典的GDB调试命令,包括查看变量,查看内存

    转载地址:http://www.cnblogs.com/rosesmall/archive/2012/04/12/2444431.html PS:如果想跟踪正在运行的进程可以: ps 查看进程id . ...

  9. 微信小程序里面的单步调试和变量查看

    在微信小程序开始学习与开发的过程中,总有一些东西,想看看它跑起来的内容与我们编程时想的是否一致,于是就想到了能不能单步调试或者打出一些我们想要的变量的内容,以便我们做进一步的开发和调整,现在我就要介绍 ...

最新文章

  1. vue.js仿饿了么app---webpack配置项
  2. 渲染测试软件 d15,D5 Render(D5 渲染器)1.7.0 正式版发布 | 一款 RTX 实时光线追踪可视化实时渲染引擎,而且是国产软件!...
  3. 简述python的特性_python的一些语言特性(一)
  4. markdown 编辑器_Markdown 编辑器使用指南
  5. 结束 txt进程_Python多进程抓取拉钩网十万数据
  6. 分享3个数据分析实战项目(附最新资料包)
  7. 阿里 8.6 亿美元再押 ofo,与摩拜合并再无可能?
  8. 关于Android屏幕适配
  9. angular源码分析 摘抄 王大鹏 博客 directive指令及系列
  10. web 开发生产率_11种可帮助Web开发人员克服最后期限的生产力工具
  11. Intellij IDEA设置类的文件头注释(@Author)(一)
  12. 国密(3)- 预主密钥/主密钥计算和Finished消息的加解密
  13. C++:求整数num中包含因子k的个数
  14. 管理储备与应急储备的区别--建群网培PMP
  15. 大连民族大学计算机学院许淑娟,大连民族大学计算机科学与工程学院2017年教师元旦联欢会圆满落幕...
  16. 单据打印处理,自动缩小字体,自动换行
  17. uni-app页面跳转问题
  18. 流程控制之python
  19. 【C#】Form窗体
  20. P3853 [TJOI2007]路标设置(二分答案)

热门文章

  1. 【Ue4卡通渲染描边方案】平均法线存入切线的改进算法——O(n)时间复杂度
  2. 开发版安装harmonyos,HarmonyOS | 小熊派鸿蒙开发板初体验
  3. 高校圆桌派-第二期话题征集等你来
  4. html css中文字段落间距怎么设置,[HTML/CSS应用]博客文档排版之设置合适的行间距与段间距...
  5. Kickstarter | 什么反重力科技上线仅一小时获千粉
  6. Linux删除不了受损文件,使用错误的文件名Linux删除损坏的文件
  7. Go-lang分布式框架选择上的历程记录【go-micro、go-zero、go-kratos】
  8. 搭建kali和win xp靶机实验环境
  9. 数据结构课程设计--立体停车场管理系统(改)
  10. 1.6万亿参数你怕了吗?谷歌大脑发布语言模型 Switch Transformer,速度碾压T5