• 上一篇文章学习了如何使用GDB进行函数调用栈的查看:【软件开发底层知识修炼】十六 快速学习GDB调试四 使用GDB进行函数调用栈的查看
  • 本篇文章是GDB调试快速学习系列的最后一篇。将综合前几篇文章做一个小的总结以及介绍一些在调试中使用的小技巧

文章目录

  • 1 调试中的小技巧
    • 1.1 断点处自动打印示例
    • 1.2 使用GDB进行符号查看
  • 2 使用GDB进行代码调试中的技巧案例分析
  • 3 总结

1 调试中的小技巧

直接上一个图,下面就是今天介绍的几个技巧命令:

  • 其中shell命令,后面代码调试分析的时候就明白了。

1.1 断点处自动打印示例

  • 可以看出,当我们在test.c的18行打上断点,运行程序到断点处,然后使用display命令,打印几个值。那么在下一次,如果程序继续运行,又到了test.c的18行的这个断点处,那么GDB会自动将刚刚使用display打印的那几个值打印出来。而不用像我们以前一样,每一次想看哪个值都需要使用print命令。

1.2 使用GDB进行符号查看

  • 符号查看可以看到符号的类型。并且我们从上图中也可以看到whatis与ptype的区别:ptype可以查看更加详细的类型。

2 使用GDB进行代码调试中的技巧案例分析

tricks.c

#include <stdio.h>int g_var = 1;struct ST
{int i;int j;
};int func()
{struct ST st[5] = {0};int i = 0;for(i=0; i<5; i++){st[i].i = i;st[i].j = i * i;}for(i=0; i<5; i++){printf("st[%d].i = %d\n", i, st[i].i);printf("st[%d].j = %d\n", i, st[i].j);}
}int main()
{static c_var = 2;func();return 0;
}
  • 上述程序比较简单,这里不多做解释
  • 我们以前都是编译好程序之后,再进入GDB进行调试。现在知道GDB支持shell,那么可以在先进入GDB后,再进行编译。在GDB中,前面加上shell命令,后面可以跟任何shell所支持的命令,如下动态图就是支持shell的各种命令的演示,编译好程序后直接start:
  • 然后我们对tricks.c的18行进行打断点(使用break tricks.c:18命令)。并使用list tricks.c:18 命令查看tricks.c的18行上下的部分内容。如下图:
  • 我们发现,这个展示的内容不够详细,我们想要展示tricks.c的18行上下附近更多的内容,可以使用set listsize 20来设置list每次展示的内容的行数,如下图所示:
  • 接下继续运行程序:continue
  • 到了18行的时候,就停下来了,此时我们使用如下三个命令来显示i,i*i,以及&i
    display /d i
    display /d i*i
    display /a &i
  • 结果如下图所示:
  • 可以看到,每一次展示都打印出了我们所想要的值。接着我们继续运行程序:continue 由于有一个for循环,所以还会在18行再次停止执行,然而这次停止执行后,就会自动打印刚刚我们使用display所想要展示的三个值,如下图:
  • 很明显,我们并没有再使用display或者print来打印那三个变量,但是在这里却自动打印了。这就是断点处自动打印的功能:display的功能
  • 我们退出刚刚的GDB调试,再重新进入GDB调试,然后直接只用run进行运行程序,发现上一次设置的断点和display的设置还在。使用undisplay即可去除display的设置。然后继续运行程序:continue,程序在18行断点处停下,然后我们可以使用下面的一些命令查看程序的一些符号信息:
  • 上图中红色是输入的命令,黄色是显示的类型。
  • 通过上述的命令练习,我们学会了如何在程序运行过程中查看符号的信息。

3 总结

  • 学会使用display进行断点处自动打印功能
  • 学会使用whatis与ptype进行查看符号的信息
  • 本文章参考狄泰软件学院相关课程 想学习的可以加狄泰软件学院群, 群聊号码:199546072

  • 学习探讨加个人(可以免费帮忙下载CSDN资源):

  • qq:1126137994

  • 微信:liu1126137994

  • 学习交流资源分享qq群:962535112

【软件开发底层知识修炼】十八 快速学习GDB调试五 使用GDB进行调试的一些小技巧相关推荐

  1. 【软件开发底层知识修炼】十七 快速学习GDB调试四 使用GDB进行函数调用栈的查看

    上一篇文章学习了如何使用GDB数据断点进行内存监测:[软件开发底层知识修炼]十五 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变 本篇文章继续上一篇文章的学习:如何使用GDB进行函数调用栈 ...

  2. 【软件开发底层知识修炼】八 Binutils辅助工具之- objdump工具 与 size,strings工具

    上一篇文章学习了ar工具与nm工具,点击链接查看上一篇文章:点击链接 本片文章学习记录以下三个工具: objdump size strings 1.objdump工具 用法: 反汇编目标文件,查看汇编 ...

  3. 【软件开发底层知识修炼】十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录

    本文记录之前写过的5篇关于GDB快速学习的文章,从第一篇开始学习到最后一篇,保证可以从入门GDB调试到熟练掌握GDB调试的技巧. 学习交流加 个人qq: 1126137994 个人微信: liu112 ...

  4. 【软件开发底层知识修炼】二十 深入理解可执行程序的结构

    上一篇文章记录了GDB调试从入门到熟练掌握的学习全过程.点击链接查看:[软件开发底层知识修炼]十九 GDB调试从入门到熟练掌握超级详细实战教程学习目录 还记得在以前的学习Binutils工具的时候,学 ...

  5. 【软件开发底层知识修炼】十六 快速学习GDB调试三 使用GDB的数据断点监测变量是否改变

    上一篇文章我们学习了如何使用GDB进行软件断点调试和硬件断点调试:[软件开发底层知识修炼]十五 快速学习GDB调试二 使用GDB进行断点调试 本篇文章继续上一篇文章的学习,如何使用GDB的数据断点监测 ...

  6. 【软件开发底层知识修炼】十五 快速学习GDB调试二 使用GDB进行断点调试

    上一篇文章我们学习了使用GDB的最基本方法:[软件开发底层知识修炼]十四 快速学习GDB调试一 入门使用 本篇文章将学习GDB的断点调试.断点调试是一种非常重要的调试方法. 文章目录 1 断点类型 2 ...

  7. 【软件开发底层知识修炼】二十八 C/C++中volatile的作用

    上一篇文章学习了C/C++中的指针与数组的区别,点击链接进行查看:[软件开发底层知识修炼]二十七 C/C++中的指针与数组是不同的 本篇文章将学习volatile关键字在C/C++中的作用 文章目录 ...

  8. 【软件开发底层知识修炼】十四 快速学习GDB调试一 入门使用

    前面几篇文章学习了链接器相关的内容.现在开始来学习GDB调试.我们的目的是通过这几篇文章将GDB调试完全学会. 文章目录 1 为什么需要GDB 2 GDB 的常规应用 3 GDB调试程序实例 4 总结 ...

  9. 【软件开发底层知识修炼】二十六 ABI-应用程序二进制接口 学习总结文章目录

    前面学习了ABI的知识,感觉受益良多.对底层与编译器有更加深刻的认识,为此这里将前面写过的关于ABI 的文章给列出来,方便学习与翻阅. [软件开发底层知识修炼]二十一 ABI-应用程序二进制接口一 [ ...

最新文章

  1. 【eclipse】eclipse使用常见问题(持续更新)
  2. Java压缩html
  3. Logistic回归主要应用领域
  4. macos系统自动安装mysql_macos系统安装mysql
  5. linux 命令 语法,linux常用命令及语法
  6. django 设置媒体url_编写第一个 django 应用
  7. mysql 重置表索引_MySQL管理表和索引
  8. wps底板颜色怎么去掉_wps怎么把复制网页的灰色阴影去掉 底纹去掉方法
  9. STM32笔记之 PWM(脉宽调制)
  10. JAVASE篇的入门经典书籍推荐
  11. 985学生:为什么现在学校还在教C语言?| 文末送书
  12. QQ空间快速登录地址
  13. Android性能优化之页面优化
  14. 常用三种写透明度的方法
  15. 关于c++中引用的基本用法
  16. 电子产品长时间不充电导致无法开机、故障、充不满电等问题(如kindle:电池+叹号)
  17. UIPATH 发送SMTP电子邮件
  18. 软件和硬件的质量曲线
  19. Linux获取系统UUID
  20. 20181213股票复盘

热门文章

  1. 59 javabean的创建
  2. java学习(158):线程的常用方法yield,优先级
  3. 玩转oracle 11g(40):Oracle11g 不区分大小写设定
  4. 项目管理(1):备战pmp
  5. java 在数组末尾添加元素_Java快问快答:用 ArrayList 还是 LinkedList?
  6. 禁止摄像机跟随`Actor`旋转 Learn Unreal Engine (with C++)
  7. jvm 参数_6个提高性能的JVM参数
  8. 数据共享如何改变世界_如何改变他人?“我不会去改变这个世界,我们会去改变自己”。...
  9. app爬虫Android 7证书设置
  10. 小白兔生小白兔-菲波拉契数列问题