Linux gdb调试

news2024/12/23 0:12:17

使用gdb进行调试

       我们将使用GNU的调试器gdb调试这个程序。gdb是一个功能很强大的调试器,它是一个自由软件,能够用在许多UNIX平台上。它同时也是Linux系统中的默认调试器。gdb已被移植到许多其他的计算机平台上,并且能够用于调试嵌入式实时系统。

单进程、单线程基础调试命令

l //显示 main 函数所在的文件的源代码
list 文件名:num //显示 filename 文件 num 行上下的源代码
b 行号 //给指定行添加断点
b 函数名 //给指点函数的第一有效行添加一个断点
info break //显示断点信息
delete 断点号 //删除指定断点
disable 断点号 //将断点设定为无效的,不加断点号,将所有断点设置为无效
enable 断点号 //将断点设定为有效的,不加断点号,将所有断点设置为有效
r(run) //运行程序
n(next) //单步执行
c (continue) //继续执行,直接执行到下一个断点处
s //进入将要被调用的函数中执行
finish //跳出函数
q //退出调试
p val //打印变量 val 的值
p &val //打印变量 val 的地址
p a+b //打印表达式的值
p arr(数组名) //打印数组所有元素的值
p *parr@len //用指向数组的指针打印数组所有元素的值
display //自动显示,参数和 p 命令一样
info display //显示自动显示信息
undisplay + 编号 //删除指定的自动显示
ptype val //显示变量类型
bt //显示函数调用栈

Debug 版本和 Release 版本

Debug 版本
       Debug 版本为可调式版本,生成的可执行文件中包含调试需要的信息。我们作为开发人员,最常用的就是 debug 版本的可执行文件。
Debug 版本的生成:
      因为调试信息是在编译过程时加入到中间文件(.o)中的,所以必须在编译时控制其生成包含调试信息的中间文件。
                    gcc -c hello.c -g —> 生成包含调试信息的中间文件
                    gcc -o hello hello.o
        或者     gcc -o hello hello.c -g
Release 版本
        Release 版本为发行版本,是提供给用户使用的版本。用 gcc 默认生成的就是 Release 版本。
        首先将源代码编译、链接生成 Debug 版本的可执行文件,然后通过gdb Debug 版本的可执行文件名进入调试模式

1.写一个有问题的C语言程序,从键盘上输入一个字符串,当字符串不为“end”时,一直输入,直到输入字符串“end”退出程序

具体演示过程如下:

 接下来运行以下程序看看

编译: 

 运行: (发现输入end后仍然会打印end,而没有正常退出)

 我们发现当输入字符串“end”时,并未退出程序,所以要对程序进行调试,寻找错误

 接下来调试:

当遇到这样的情况时,说明main程序没有包含调试信息:

 解决方法:gcc -o main main.c -g

启动gdb调试方法: 

 l:显示代码 一次显示十行  (l+行号 指定想要跳转到的行号)

 

 

 

 启动程序:r: 运行程序 或者启动程序

 

单步执行:n

打印 :p

 找到问题 end\n fgets会读到\n:

打印buff,我们发现buff是“end\n”,并不是“end”,显然与“end”不相等,找到问题所在

 退出: q

 修改代码:

  1 #include<stdio.h>
  2 #include<string.h>
  3 int main()
  4 {
  5    while(1)
  6    {
  7      printf("input:\n");
  8      char  buff[128] = {0};
  9      fgets(buff,128,stdin);
 10      buff[strlen(buff)-1] = '\0';
 11     // buff[strlen(buff)-1] = 0;
 12      if(strcmp(buff,"end") == 0)
 13      {
 14       break;
 15      }
 16      printf("read:%s\n",buff);
 17    }
 18    return 0;
 19 }

 重新编译和运行。

2.调试程序有多个文件

 写一个add.c

 

在main.c中引用

 声明add

一步完成编译

 

 

 在add.c的第四行加断点,在main.c的第十二行加断点:

 

 b+函数名: 在函数的入口加断点

 运行程序 单步执行:

 c (continue//继续执行,直接执行到下一个断点处

 

3. 演示gdb调试怎么进入函数

s //进入将要被调用的函数中执行

finish //跳出函数

 

 

 

 

 

 

总结:

以后程序出现问题的时候调试,跟踪代码

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/532042.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(转载)从0开始学matlab(第6天)—数据文件与运算

1数据文件 有许多的方法用于加载和保存 MATLAB 的数据文件&#xff0c;这些方法后面进行介绍。在这里我们只向大家介绍最简单的 save 和 load 命令。 save 命令用于保存当前 MATLAB 工作区内的数据到一个硬盘文件。这个命令的基本形式如下 save filename var1 var2 var3 …

《拥抱AGI时代,电信日前省级电信公司的一次“非电信”培训》

数字信息基础设施是数字中国的关键底座&#xff0c;打通数字基础设施大动脉&#xff0c;建设数字中国成为推进中国式现代化的重要引擎。作为算力时代的探险家&#xff0c;出海浪潮的逐浪人&#xff0c;中国电信正全面融入数字经济建设大局&#xff0c;展现出新发展新格局下央企…

飞凌嵌入式技术帖——i.MX9352的GPIO怎么用?

之前小编为大家介绍过在飞凌嵌入式i.MX6ULL开发板上操作GPIO的方法。本期&#xff0c;让我们一起走近i.MX9352处理器&#xff0c;深入了解这位i.MX系列新成员的GPIO该如何操作&#xff0c;以及它与前辈i.MX6ULL处理器又有哪些异同。 01 硬件原理分析 以点灯和按键为例&#xf…

也谈零基础学编程,需要学什么

也谈零基础学编程&#xff0c;需要学什么 零基础人群语法1、注释2、变量2.1 变量命名2.2 数据类型2.3 类型强度 3、 运算符4、流程控制与代码块5、函数和方法6、类 算法学会使用第三方库小结 零基础人群 现在开发语言各种各样&#xff0c;越来越多&#xff0c;尤其是 python &…

算法训练-双指针

双指针 同向双指针3. 无重复字符的最长子串209. 长度最小的子数组713. 乘积小于 K 的子数组 相向双指针167. 两数之和 II - 输入有序数组15. 三数之和438. 找到字符串中所有字母异位词 滑动窗口接雨水 同向双指针 3. 无重复字符的最长子串 题目链接 class Solution { public:…

09——svg中path的使用

一、path 是 svg 中最强大的图形 用于定义一个 路径所有命令均允许小写字母。大写 表示绝对定位&#xff0c;小写 表示 相对定位 &#xff08;相对于上一个结束的坐标&#xff09;d 属性中包含所有路径的点&#xff0c;可根据命令缩写 自由组合 命令 名称 …

阿里云备案服务码是什么?备案服务码申请及限制说明

阿里云备案服务码是什么&#xff1f;ICP备案服务码怎么获取&#xff1f;阿里云备案服务码分为免费和付费两种&#xff0c;申请备案服务码是有限制条件的&#xff0c;需要你的阿里云账号下有可用于申请备案服务码的云产品&#xff0c;如云服务器、建站产品、虚拟主机等&#xff…

【刷题之路Ⅱ】LeetCode 475. 供暖器

【刷题之路Ⅱ】LeetCode 475. 供暖器 一、题目描述二、解题1、方法1——排序后二分法1.1、思路分析1.2、代码实现 2、方法2——排序后双指针2.1、思路分析2.2、代码实现 一、题目描述 原题连接&#xff1a; 475. 供暖器 题目描述&#xff1a; 冬季已经来临。 你的任务是设计一…

怎样能把两张照片拼成一张图片,5种工具分享

怎样能把两张照片拼成一张图片&#xff1f;图片拼合的应用场景是很多的。比如将几张相册中的照片拼成一张合影、将多个地图截图拼合在一起形成一个更大的区域地图、将多个漫画图像合并成一本漫画册等。这项技术可以方便地将多张图片整合为一张&#xff0c;节省时间和精力。 因此…

ThinkPHP6布局的方式之模板布局,全局配置方式,模板标签方式,动态方法布局

ThinkPHP6布局的方式之模板布局 ThinkPHP的模板引擎内置了布局模板功能支持&#xff0c;可以方便的实现模板布局以及布局嵌套功能。 有三种布局模板的支持方式&#xff1a;全局配置方式&#xff0c;模板标签方式&#xff0c;动态方法布局。 第一种方式&#xff1a;全局配置方…

有价值项目分享,缺项目可直接搜索(持续更新中)

​近来统计一下最近发的一些资源&#xff0c;包括CSDNB站微信公众号三个平台&#xff0c;仅包括Java资源&#xff08;SSMSpringBootuniapp&#xff09;、部分硬件、安卓资源&#xff0c;一共30758492588275个&#xff0c;可覆盖95%的毕业题目&#xff0c;大家可在相关归档内获取…

2023 年破解 PDF 密码的 5 种最佳方法

世界越来越依赖数字文档和信息存储。最流行和广泛使用的数字文档文件格式之一是便携式文档格式 (PDF)。PDF 文件用途广泛、可靠&#xff0c;并提供高级别的安全性以保护敏感信息免遭未经授权的访问。保护 PDF 的一种常用方法是通过密码保护。在这篇博文中&#xff0c;我们将讨论…

从SRM到采购供应链,云时通SRM助力东明实现采购数字化再升级!

随着制造业不断向高端跃升&#xff0c;十年来&#xff0c;中国制造企业早已具备全球领先水平。而引领制造业向数字化、网络化、智能化转型升级&#xff0c;是中国智造进一步跨越的关键。 1995年&#xff0c;浙江东明不锈钢制品股份有限公司(以下简称“东明”)成立&#xff0c;作…

超细!从零安装压测工具 jmeter(附JDK下载安装教程,20230516的JDK8最新版)

两步走&#xff0c;安装 JDK 和 jmeter&#xff0c;如果安装了JDK的同志可以直接看第二步。 针对的操作系统&#xff1a;Windows。 下载JDK 官网指路&#xff08;处于稳定性考虑&#xff0c;安装的JDK8&#xff09;&#xff1a; Java Downloads | Oraclehttps://www.oracle.c…

Java配置方式使用Spring MVC

文章目录 基于Java配置方式使用Spring MVC一、创建Maven项目二、添加相关依赖三、创建日志属性文件四、创建首页文件五、创建Spring MVC配置类六、创建Web应用初始化配置类七、创建演示控制器八、配置Tomcat服务器九、启动服务器&#xff0c;查看效果 基于Java配置方式使用Spri…

「计算机网络」HTTP1.0、HTTP1.1和HTTP2.0的演变

「计算机网络」HTTP1.0、HTTP1.1和HTTP2.0的演变 参考&鸣谢 HTTP1.0、HTTP1.1、HTTP2.0的关系和区别 doubleYong 计算机网络_HTTP1.0、HTTP1.1和HTTP2.0的区别 一只前端小马甲 文章目录 「计算机网络」HTTP1.0、HTTP1.1和HTTP2.0的演变一、先说结论二、HTTP网络请求过程三…

【01】一步一步命令行输出VC hello world

一步一步命令行输出VC hello world 安装VS2022编写hello world程序配置cl.exe编译helloworld.cpp总结 安装VS2022 VS2022的安装程序下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 。下载完成之后点击程序会进入到选择安装VS2022组件的安装程序&#xff0c;…

小红的好数组陡峭值之和

题目如下 这个题我一开始是先生成满足0&#xff0c;1&#xff0c;2的全排列&#xff0c;但是n很大时很快就超出内存限制了&#xff0c;后来想到用动态规划的方法做&#xff0c;这里先分析一下。 n2时&#xff0c;有01&#xff0c;02&#xff0c;10&#xff0c;12&#xff0c;2…

自动化设备应用之样本手册

Lookbook&#xff0c;新品展示图&#xff0c;是时尚品牌的必备品。Lookbook既展示了新系列&#xff0c;也突出了品牌的基本调性。创建样本手册是释放创造力并从其他时装设计师中脱颖而出的机会。有吸引力的封面、精心策划的图像、精巧的布局、颜色标识和传达风格都是品牌内容传…

建构筑物安全监测

监测要求 1&#xff09;观测点应设置在观测段结构构件的控制断面上&#xff1b; 2&#xff09;平面应力状态的结构应力观测宜设置三向应变观测点,主应力方向明晩的部位可设置单向或两向应变观测点&#xff1b; 3&#xff09;建筑物的重要部位应增设观测点&#xff1b; 4&am…