当前位置: 首页 > news >正文

【Linux系统编程】调试器-gdb/cgdb

【Linux系统编程】调试器-gdb/cgdb

  • 1. Debug和Release
  • 2. gdb/cgdb基本命令和使用
    • 2.1 list/l 命令
    • 2.2 break/b、info break/b、delete/d breakpoints
    • 2.3 r/run、n/next、s/step
    • 2.4 print/p、display、undisplay、until
    • 2.5 finish、continue/c
    • 2.6 disable breakpoints、 enable breakpoints
    • 2.7 set var
    • 2.8 watch
    • 2.9 条件断点

1. Debug和Release

gdb/cgdb是一个强大的调试工具,支持多种编程语言,主要用于C/C++程序调试。

我们以下面的代码为例去认识gdb/cgdb。

// mycmd.c
#include <stdio.h>//int flag = 0; // 故意错误
//int flag = -1;
int flag = 1;int Sum(int s, int e)
{int result = 0;int i = s;for(; i <= e; i++){result += i;}return result * flag;
}int main()
{int start = 1;int end = 100;printf("I will begin\n");int n = Sum(start, end);printf("running done, result is: [%d~%d]=%d\n", start, end, n);return 0;
}

我们用gcc去直接编译该代码生成的二进制程序是Release版本的。

我们用命令readelf -S mycmd | grep -i debug去检查可执行文件或目标文件(即mycmd)中是否包含调试信息,以及调试信息的详细情况。在这里插入图片描述
发现mycmd中没有任何调试信息。

要想让gcc编译mycmd.c生成debug版本的二进制程序要加-g选项

gcc -g mycmd.c -o mycmd-debug

发现mycmd-debug确实有调试信息。
在这里插入图片描述

而且从文件大小也能看出mycmd-debug确实有调试信息。

在这里插入图片描述
既然gdb是调试器,那么分别对mycmd和mycmd-debug用gdb调试,也能看出来mycmd是没有调试信息的。
在这里插入图片描述

2. gdb/cgdb基本命令和使用

2.1 list/l 命令

list/l 行号 :显示源代码,从上次位置开始,每次列出10行
list/l 函数名 :列出指定函数的源代码
list/l ⽂件名:⾏号 :列出指定⽂件的源代码

在这里插入图片描述
quit:退出gdb
在这里插入图片描述
是不是感觉如果通过list查看行号,然后调试的话特别麻烦?
所以可以使用cgdb,cgdb和gdb的命令是完全一样的。不同的是cgdb可以直接看着代码去调试。

在这里插入图片描述
在这里插入图片描述

2.2 break/b、info break/b、delete/d breakpoints

break/b [文件名]:行号 :在指定⾏号设置断点
break/b 函数名 :在函数开头设置断点
info break/b :查看当前所有断点的信息

在这里插入图片描述

delete/d breakpoints :删除所有断点
delete/d breakpoints n :删除序号为n的断点

注意:删除时 n 指的是序号,不是行号
在这里插入图片描述

2.3 r/run、n/next、s/step

r/run :从程序开始连续执⾏
n/next :单步执⾏,不进⼊函数内部
s/step :单步执⾏,进⼊函数内部

请添加图片描述

2.4 print/p、display、undisplay、until

print/p 表达式 :打印表达式的值
p 变量 :打印指定变量的值
display 变量名 :跟踪显示指定变量的值(每次停⽌时)
undisplay 编号 :取消对指定编号的变量的跟踪显示
until 行号 执⾏到指定⾏号

什么命令也不输入直接执行,会执行上次输入的命令

请添加图片描述

2.5 finish、continue/c

finish :执⾏到当前函数返回,然后停⽌
continue/c :从当前位置开始连续执⾏程序

请添加图片描述

2.6 disable breakpoints、 enable breakpoints

disable breakpoints :禁用所有断点
enable breakpoints :启用所有断点

在这里插入图片描述

为什么不直接删除断点,而选择禁用断点,防止此次调试debug未彻底,以便以后再次debug。

2.7 set var

set var 变量=值 :修改变量的值

为了更好地演示,先把flag从1改成0

// mycmd.c
#include <stdio.h>int flag = 0; // 故意错误
//int flag = -1;
//int flag = 1;int Sum(int s, int e)
{int result = 0;int i = s;for(; i <= e; i++){result += i;}return result * flag;
}int main()
{int start = 1;int end = 100;printf("I will begin\n");int n = Sum(start, end);printf("running done, result is: [%d~%d]=%d\n", start, end, n);return 0;
}

改完后发现1~100的和为0,假如我们不知道是flag导致的错误,此时我们要用cgdb进行调试。
在这里插入图片描述

我们调试到这里,发现是因为flag=0,导致的函数返回值为0,进而导致输出结果为0,我们如果结束调试把flag改为1再测试程序是否正确的话太慢了,所以可以用命令set var flag=1,在调试中让flag=1,观察结果是否正确,加快了调试效率。

在这里插入图片描述

发现结果正确,所以得出结论是因为flag错误而导致的程序结果错误。

在这里插入图片描述

2.8 watch

执行时监视⼀个表达式(如变量)的值。如果监视的表达式在程序运行期间的值发⽣变化,GDB会暂停程序的执行,并通知使⽤者。

如果你有⼀些变量不应该修改,但是你怀疑它修改导致了问题,你可以watch它,如果变化了,就会通知你.

在这里插入图片描述

2.9 条件断点

添加条件断点

b 行号/文件名:行号/函数名 if 条件

在这里插入图片描述

给已经存在的断点新增条件

condition 编号 条件

在这里插入图片描述

http://www.dtcms.com/a/553154.html

相关文章:

  • 【JUnit实战3_20】第十一章:用 Gradle 运行 JUnit 测试实战
  • TouchDIVER Pro 触觉手套:Weart把火星岩石触感、手术操作感搬进 XR
  • 极不均匀电场的强垂直分量和弱垂直分量
  • 直播卡顿?会议割裂?视频直播点播平台EasyDSS全新升级,一平台终结音视频“老大难”!
  • Dotnet使用System.Xml.Serialization处理Xml序列化
  • 【JUnit实战3_19】第十章:用 Maven 3 运行 JUnit 测试(下)
  • wordpress 禁止过滤张家口seo
  • 网站建设的流程该怎么确定自己怎么设计logo制作
  • 3.游戏逆向-pxxx-对照UE源码和IDA分析GName偏移(ida中calloff开头地址的说明)
  • AR智能巡检:开启工业运维的“透视眼”
  • PhotoQt,一款轻量级图片浏览器
  • 什么是一级boot和二级boot
  • 网站开发师招聘网站建设几个要素
  • Java语言处理Js文件内容格式化
  • 力扣Hot100--哈希表--day01
  • 鸿蒙技术知多点,技术深入、鸿蒙开发实战分享(一)——下载功能按钮与全局悬浮窗联动实战开发
  • 安科瑞暖通空调解决方案可覆盖分体空调、中央空调和多联机等类型空调系统,有效帮助用户实现空调系统节能降本
  • 用php做购物网站视频网站建设 翰臣科技公司
  • 本地音乐库嫌麻烦?PlaylistDL+cpolar打造“随身听”云端曲库!
  • 巩义网站建设定制电子商务系统网站开发总结
  • Excel怎么在下拉菜单中选择计算方式?
  • PHY6252国产蓝牙低成本透传芯片BLE5.2智能灯控智能家居
  • unity之线框模式
  • h5游戏免费下载:小飞鱼?
  • 【设计模式】享元模式(Flyweight)大白话讲解!
  • seo网站优化知识网站设计师的工作环境
  • 浅谈onlyoffice开发全流程(一、基础介绍)
  • 金仓KRDS云数据库服务管控平台:构建高效智能的数据库运维体系
  • GMI Cloud:如何构建全球化高性能分布式推理服务?
  • Linux入门攻坚——52、drbd - Distribute Replicated Block Device,分布式复制块设备-1