调试工具之GDB的基本使用
GDB基本使用
GDB是Linux下一款非常强大的调试软件,其实就是GNU Debugger的缩写。接下来我们学习一下他的基本使用。
例子函数,其中只有一个ds18b20的采集温度函数和一个主函数:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>int measure_temp(float *temp);int main(int argc,char *argv[])
{float temp = 0;measure_temp(&temp);printf("the temp:%f\n",temp);return 0;
}int measure_temp(float *temp)
{int fd = -1;//打开ds18b20时候的文件描述符int found = -1;//是否找到chip的参数。char *w1_path = "/sys/bus/w1/devices/"; //文件名的前半段,28-后面不能确定,因为设备号会变化,我们一会获取。char chip[32];//文件名的后半段,-28char ds_path[128];//拼凑出全部的路径名DIR *dirp = NULL;//打开w1时返回的DIR类型文件指针struct dirent *direntp = NULL;//是readdir后返回的文件夹信息结构体指针char buf[1024];char *ptr;//用来指向温度值if (NULL == temp){printf("mesure_temp arguments error:[%s]\n",strerror(errno));return -1;}printf("measure_temp arguments right!\n");//打开devices文件夹if ( NULL == (dirp = opendir(w1_path)) ){printf("open w1_path error:[%s]\n",strerror(errno));return -2;}printf("open w1_path DIR[%p] success!\n",dirp);//readdir查找这个文件夹下有什么while(NULL != (direntp=readdir(dirp))){if (strstr(direntp->d_name,"28-")){strncpy(chip,direntp->d_name,sizeof(chip));//duancuowufound = 1;}}closedir(dirp);if (found < 0){printf("nofind \"-28\" \n");return -3;}printf("find chip success[%s]\n",chip);snprintf(ds_path,sizeof(ds_path),"%s%s/w1_slave",w1_path,chip);printf("ds_path:%s\n",ds_path);if ((fd = open(ds_path,O_RDONLY)) < 0){printf("open error[%s]\n",strerror(errno));return -4;}int i;int *p = NULL;p = &i;//read fd memset(buf,0,sizeof(buf));if ( read(fd,buf,sizeof(buf)) <=0 ){printf("error:[%s]\n",strerror(errno));return -5;}//printf("temperature:[%s]\n",buf);if ( NULL == (ptr = strstr(buf,"t=") )){printf("nofound error[%s]\n",strerror(errno));return -6;}//printf("%s\n",ptr);ptr += 2;*temp = atof(ptr)/1000;return 0;
}
(1)首先我们使用 gcc 直接生成的程序是没有调试信息的,所以我们要使用 gcc -g 命令来生成一个带有调试信息版本的目标文件。

(2)然后我们用 gdb 来打开这个目标文件,其实就是让带有调试信息的二进制文件在我们 gdb 的这个 “盒子” 里面进行运行。 用 gdb + 目标文件 命令来运行它。

(3)之后我们就可以开始调试啦!如何让 test_gdb.o 这个文件在gdb中跑起来呢?在 gdb 中输入 run 就可以了。

(4)不过我们发现,这和不使用 gdb 跑程序没有什么区别,所以我们学习如何增加断点。
增加断点是通过 break 命令来实现的,他有三种基本的使用形式,如下:
(gdb) break main # 在 main 函数处设置断点
(gdb) break my_program.c:10 # 在 my_program.c 文件的第 10 行设置断点
(gdb) break my_function # 在 my_function 函数处设置断点
(5)这里假设我们程序异常退出了,但我们不清楚导致退出的错误是发生在 measure 测温函数内还是函数之前,我们就可以在进入这个函数之前,设置一个断点,然后运行它。
我们可以看到,程序成功运行到了这个函数前,没有抛出异常,那么我们就可以确定,异常是在 measure 测温函数内的了。
(6)使用 next 单步执行,但是不进入到函数内部。

(7)也可以使用step单步执行,但是会进入到函数内部。

(8)使用bt命令或者backtrace命令显示调用的栈信息:

(9)显示所有的断点:

(10)删除特定的某一个断点:

运行到某一个断点后,要直接运行到下一个断点,使用continue 或者 c 就可以了。若后面没有断点了,那么就会一直运行到结束或者某个循环里面。
命令汇总:
(gdb) break main # 在 main 函数处设置断点
(gdb) break my_program.c:10 # 在 my_program.c 文件的第 10 行设置断点
(gdb) break my_function # 在 my_function 函数处设置断点(gdb) next # 或 (gdb) n 单步执行,不进入函数内部
(gdb) step # 或 (gdb) s 单步执行,进入函数内部
(gdb) finish # 运行到当前函数返回的位置
(gdb) until # 运行到循环结束的位置(gdb) run # 启动程序
(gdb) continue # 或 (gdb) c 继续运行直到下一个断点(gdb) backtrace # 或 (gdb) bt 显示调用栈
(gdb) frame n # 切换到调用栈中的第 n 帧
(gdb) info frame # 显示当前帧的信息
(gdb) info locals # 显示当前帧的局部变量(gdb) info breakpoints # 或 (gdb) info b 显示所有断点
(gdb) delete breakpoint_number # 或 (gdb) d breakpoint_number 删除特定断点
(gdb) clear # 删除当前行的断点
(gdb) disable breakpoint_number# 禁用特定断点
(gdb) enable breakpoint_number # 启用特定断点
当然,我们也可以在运行过程中对某些变量进行查看和修改:

这里用到的命令是:
print 变量名 #打印变量的值,注意,没有print,没有f。
set var 变量 = 值 # 改变某个变量的值
相关文章:
调试工具之GDB的基本使用
GDB基本使用 GDB是Linux下一款非常强大的调试软件,其实就是GNU Debugger的缩写。接下来我们学习一下他的基本使用。 例子函数,其中只有一个ds18b20的采集温度函数和一个主函数: #include <stdio.h> #include <errno.h> #includ…...
C++ //练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。
C Primer(第5版) 练习 16.14 练习 16.14 编写Screen类模板,用非类型参数定义Screen的高和宽。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 template <int H, int W> class Screen{…...
【Java】深度解析监视器的组成原理
目录 一、什么是监视器(Monitor)二、监视器的组成部分三、线程的状态转换四、总结 一、什么是监视器(Monitor) 在Java中,监视器(Monitor)是用来实现线程同步的一种机制。每个Java对象都有一个与…...
Day14-Servlet后端验证码的实现
图片验证码的生成采用的是Kaptcha; Kaptcha是一个高度可配置的验证码生成工具,由Google开源。它通过一系列配置文件和插件,实现了将验证码字符串自动转换成图片流,并可以与session进行关联,从而在验证过程中使用&#…...
MySQL:数据库权限与角色
权限 MySQL 的权限管理系统是保障数据库安全性的关键组件之一。它允许数据库管理员精确控制哪些用户可以对哪些数据库对象执行哪些操作。 自主存取控制 DAC(DiscretionaryAccess Control):用户对于不同的数据库对象有不同的存取权限,不同的…...
等保测评练习卷25
等级保护初级测评师试题25 姓名: 成绩: 一、判断题(10110分) 1.安全区域边界对象主要根据系统中网络访问控制设备的部署情况来确定()不是网络访问控制设备而…...
《python语言程序设计》2018第6章第28题 掷骰子 两个色子,分别是1到6
2、3、12 玩家输 7、11玩家赢 4、5、6、8、9、10算1点,之后出7玩家输或者和上一次相同。def rolled(num_t):count 0still_win 0second_win 0still_lose 0second_lose 0while count < num_t:a_1 random.randint(1, 6)b_1 random.randint(1, 6)tTen a_1 b…...
Java方法递归
目录 1.方法递归调用 基本介绍 递归能解决什么问题? 八皇后问题 递归举例 递归重要规则 练习 2.递归调用应用实例-迷宫问题 3.递归调用实例-汉诺塔 4.递归调用实例-八皇后问题 1.方法递归调用 基本介绍 简单来说,递归就是自己调用自己。 …...
目标跟踪那些事
目标跟踪那些事 跟踪与检测的区别 目标跟踪和目标检测是计算机视觉中的两个重要概念,但它们的目的和方法是不同的。 目标检测(object Detection):是指在图像或视频帧中识别并定位一个或多个感兴趣的目标对象的过程 。 目标跟踪(object Tracking)&…...
【Git】 如何将一个分支的某个提交合并到另一个分支
【Git】 如何将一个分支的某个提交合并到另一个分支 在使用 Git 进行版本控制时,常常会遇到这样的需求:将某个分支的特定提交合并到另一个分支中。这种情况下,我们可以使用 cherry-pick 命令来实现。本文将详细介绍 cherry-pick 命令的使用方…...
【嵌入式之RTOS】什么是消息队列
目录 一、FreeRTOS消息队列的基本概念 二、FreeRTOS消息队列的工作原理 三、FreeRTOS消息队列的特点 四、FreeRTOS消息队列的应用 五、示例 消息队列是一种用于任务间通信的机制,它允许一个任务(生产者)向消息队列发送消息,而…...
9-springCloud集成nacos config
本文介绍spring cloud集成nacos config的过程。 0、环境 jdk 1.8maven 3.8.1Idea 2021.1nacos 2.0.3 1、项目结构 根项目nacos-config-sample下有两个module,这两个module分别是两个springboot项目,都从nacos中获取连接mysql的连接参数。我们开工。 …...
市场主流 AI 视频生成技术的迭代路径
AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构(TransformerDiffusion)等多个阶段,每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…...
移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——1.c++入门(2)
1. 函数重载 C⽀持在同⼀作⽤域中出现同名函数,但是要求这些同名函数的形参不同,可以是参数个数不同或者 类型不同。这样C函数调⽤就表现出了多态⾏为,使⽤更灵活。C语⾔是不⽀持同⼀作⽤域中出现同 名函数的。 #include<iostream> u…...
【Python系列】深入理解 Python 中的 `nonlocal` 关键字
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Flask目录结构路由重定向简单实例讲解——轻量级的 Python Web 框架
假设一个flask目录结构如下: my_flask_app/ │ ├── app.py ├── routes/ │ ├── __init__.py │ ├── ZhejiangProvince/ │ │ ├── __init__.py │ │ ├── la.py │ │ └── el.py │ ├── GuangdongProvince/ │ │ ├…...
破解PyCharm插件更新难题:让IDE焕发新生
破解PyCharm插件更新难题:让IDE焕发新生 PyCharm作为业界领先的集成开发环境(IDE),其丰富的插件生态是其强大功能的重要来源。然而,插件无法更新的问题可能会困扰许多用户,影响开发体验。本文将详细介绍如…...
cmake常用命令学习
1.include https://blog.csdn.net/qq_38410730/article/details/102677143 CmakeLists.txt才是cmake的正统文件,而.cmake文件是一个模块文件,可以被include到CMakeLists.txt中。 include指令一般用于语句的复用,也就是说,如果有…...
K8S可视化管理平台KubeSphere
什么是 KubeSphere ? KubeSphere 是一款开源项目,在目前主流容器调度平台 Kubernetes 之上构建的企业级分布式多租户容器管理平台,提供简单易用的操作界面以及向导式操作方式,在降低用户使用容器调度平台学习成本的同时ÿ…...
Bugku-CTF-聪明的php
pass a parameter and maybe the flag files filename is random :> 传递一个参数,可能标记文件的文件名是随机的: 于是传一下参,在原网页后面加上/?a1,发现网页出现了变化 3.传入参数,一般情况下是文件包含,或者命令执行&…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地
借阿里云中企出海大会的东风,以**「云启出海,智联未来|打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办,现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...
Golang——7、包与接口详解
包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
