GDB动态调试学习-2-【断点】

news2025/2/27 2:50:00

文章目录

  • 在程序地址上打断点
  • 在程序入口处打断点
    • 获取程序入口地址
  • 在命名空间设置断点
    • 命名空间
    • 给命名空间的函数下断电
  • 在文件行号上打断点
  • 保存已经设置的断点
  • 设置临时断点
  • 设置条件断点
    • command指令
  • 忽略断点

在程序地址上打断点

当调试汇编程序,或者没有调试信息的程序时,经常需要在程序地址上打断点,方法为b *address。例如:
在这里插入图片描述
停在了断点的位置
在这里插入图片描述

在程序入口处打断点

获取程序入口地址

readelf -h  可执行文件名

在这里插入图片描述

info files

在这里插入图片描述
运行后再执行info file
在这里插入图片描述
注意程序入口点地址是_start函数的起始地址
在这里插入图片描述

start 指令启动程序,完全等价于先在 main() 主函数起始位置设置一个断点,然后再使用 run 指令启动程序。

另外,程序执行过程中使用 run 或者 start 指令,表示的是重新启动程序。

在命名空间设置断点

命名空间

命名空间(英语:Namespace),也称命名空间、名称空间等,它表示着一个标识符(identifier)的可见范围。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其他命名空间中。

例如,设Bill是X公司的员工,工号为123,而John是Y公司的员工,工号也是123。由于两人在不同的公司工作,可以使用相同的工号来标识而不会造成混乱,这里每个公司就表示一个独立的命名空间。如果两人在同一家公司工作,其工号就不能相同了,否则在支付工资时便会发生混乱。

给命名空间的函数下断电


namespace Foo
{
  void foo()
  {
  }
}

namespace
{
  void bar()
  {
  }
}
int main()
{


  return 0;
}
info functions     查看函数

在这里插入图片描述

在这里插入图片描述

在文件行号上打断点

此时编译带调试信息-g
且linenum对应到的是源码文件的main函数的第几行

b linenum或者b file:linenum

保存已经设置的断点

在GDB中,你可以使用save命令来保存你的断点。以下是如何使用这个命令的步骤:

  • 首先,你需要设置你想要的断点。你可以使用break命令来设置断点。例如,如果你想在函数foo上设置一个断点,你可以输入break foo。

  • 一旦你设置了断点,你可以使用info breakpoints命令来查看你已经设置的所有断点。

  • 最后,你可以使用save命令来保存你的断点。你可以选择保存到一个特定的文件中,例如,save breakpoints my_breakpoints将会把断点保存到my_breakpoints文件中。

注意:save命令将会保存所有的断点,不仅仅是你刚刚设置的那个。

在这里插入图片描述

在GDB中,source指令用于执行一个文件作为GDB命令序列。

source指令非常有用,尤其是在你需要重复执行一系列复杂的命令时。你可以将这些命令写入一个脚本文件,然后使用source指令来执行这个文件中的命令,这样可以大大提高调试效率。例如,如果你有一个包含多个断点和观察点的复杂调试会话,你可以将所有的设置保存到一个脚本中,下次调试时只需加载这个脚本即可。

在这里插入图片描述

设置临时断点

在使用gdb时,如果想让断点只生效一次,可以使用“tbreak”命令(缩写为:tb)。
在这里插入图片描述
在这里插入图片描述

设置条件断点

/* a/file.c */
#include <stdio.h>

void print_a (void)
{
  puts ("a");
}

/* b/file.c */
#include <stdio.h>

void print_b (void)
{
  puts ("b");
}

/* main.c */
extern void print_a(void);
extern void print_b(void);

int main(void)
{
  int i=1;
  print_a();
  print_b();
  i=2;
  return 0;
}

在这里插入图片描述

在GDB中,你可以使用break命令来设置条件断点。条件断点允许你指定一个表达式,只有当该表达式的值为真时,程序才会在该处停止执行。

当执行到断电处时断点是否生效取决于执行到断点时条件是否满足而不是下断电时条件是否满足

以下是如何设置条件断点的步骤:

  1. 首先,你需要设置你想要的断点。你可以使用break命令来设置断点。例如,如果你想在函数foo上设置一个断点,你可以输入break foo。

  2. 然后,你可以使用condition命令来为该断点添加条件。例如,如果你想要只在变量x大于10时在该断点处停止执行,你可以输入condition 1 x>10。

  3. 最后,你可以使用info breakpoints命令来查看你已经设置的所有断点及其条件。

注意:如果条件表达式的结果为假,则程序将不会在该处停止执行。此外,你也可以使用commands命令来指定在满足条件时要执行的命令序列。

command指令

在GDB中,commands命令确实可以指定一组命令,使得每次程序运行到某个断点时,这组命令会被自动执行。以下是commands命令的具体使用方式:

指定断点:首先,你需要有一个已经设置好的断点,可以使用break命令来设置断点。例如,break main会在main函数处设置一个断点。
添加命令:然后,你可以使用commands命令 followed by the breakpoint number(断点编号)来为该断点添加要执行的命令。例如,如果你想在断点1处打印变量x的值并继续执行程序,你可以输入:

commands 1
silent
print x
continue
end

这里,silent命令用于禁止GDB显示来自continue命令的提示信息。
查看断点:最后,你可以使用info breakpoints命令来查看你已经设置的所有断点及其关联的命令。
此外,你还可以将commands命令与条件断点结合使用,以便在特定条件下执行一系列命令。例如,如果你想在变量x大于10时在断点处打印其值,你可以设置如下命令:

break 2 if x > 10
commands 2
silent
print x
continue
end

通过这种方式,commands命令可以帮助你自动化调试过程中的一些重复性任务,从而提高调试效率。

忽略断点

#include <stdio.h>
	
int main(void)
{
        int i = 0;
		int sum = 0;

		for (i = 1; i <= 200; i++)
		{
			sum += i;
		}
	
		printf("%d\n", sum);
        return 0;
}

在设置断点以后,可以忽略断点,命令是“ignore bnum count”:意思是接下来count次编号为bnum的断点触发都不会让程序中断,只有第count + 1次及以后断点触发才会让程序中断。以上面程序为例:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

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

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

相关文章

docker创建mongodb数据库容器

介绍 本文将通过docker创建一个mongodb数据库容器 1. 拉取mongo镜像 docker pull mongo:3.63.6版本是一个稳定的版本&#xff0c;可以选择安装此版本。 2. 创建并启动主数据库 容器数据卷配置 /docker/mongodb/master/data # 数据库数据目录&#xff08;宿主机&am…

vue + koa + 阿里云部署 + 宝塔:宝塔前后端部署

接上篇&#xff0c;我们已经完成了宝塔的基本配置&#xff0c;下面我们来看如何在宝塔中部署前后端 一、上传前后端代码文件 在www > wwwroot目录下创建了一个demo文件&#xff0c;用来存放前后端代码 进入demo中&#xff0c;点击上传 这里前端我用的打完包的 dist文件&am…

微信公众号关键词自动回复

今天主要给大家讲一下如何实现微信公众号关键词的自动回复功能&#xff0c;就如网站的文章而言&#xff0c;进行人机识别&#xff0c;需要关注公众号回复验证码获取到验证码从而展示文章内容&#xff0c;&#xff0c;具体效果如下图。 springboot 2.3.2RELEASE 1、微信公众平台…

消息中间件篇之Kafka-消息不丢失

一、 正常工作流程 生产者发送消息到kafka集群&#xff0c;然后由集群发送到消费者。 但是可能中途会出现消息的丢失。下面是解决方案。 二、 生产者发送消息到Brocker丢失 1. 设置异步发送 //同步发送RecordMetadata recordMetadata kafkaProducer.send(record).get();//异…

vue3 使用qrcodejs2-fix生成二维码并可下载保存

直接上代码 <el-button click‘setEwm’>打开弹框二维码</el-button><el-dialog v-model"centerDialogVisible" align-center ><div class"code"><div class"content" id"qrCodeUrl" ref"qrCodeUrl&q…

设计模式-结构型模式-组合模式

组合模式&#xff08;Composite Pattern&#xff09;&#xff1a;组合多个对象形成树形结构以表示具有“部分—整体”关系的层次结构。组合模式对单个对象&#xff08;即叶子对象&#xff09;和组合对象&#xff08;即容器对象&#xff09;的使用具有一致性&#xff0c;又可以称…

IT廉连看——Uniapp——页面样式与布局

IT廉连看——Uniapp——页面样式与布局 目标&#xff1a; 了解样式与布局的规范 熟记px和rpx的区别 全局样式与index样式的区别 一、查看uniapp框架简介——尺寸单位 px尺寸单位的使用是贯穿始终的。 [IT廉连看] 二、尺寸单位——实操效果 1、打开Hbuilder X并进入in…

Mycat核心教程--Mycat 监控工具【四】

Mycat核心教程--Mycat 监控工具 九、Mycat 监控工具9.1.Mycat-web 简介9.2.Mycat-web 配置使用9.2.1.ZooKeeper 安装【上面有】9.2.2.Mycat-web 安装9.2.2.1.下载安装包9.2.2.2.安装包拷贝到Linux系统/opt目录下&#xff0c;并解压9.2.2.3.拷贝mycat-web文件夹到/usr/local目录…

【MySQL面试复习】谈一谈你对SQL的优化经验

系列文章目录 在MySQL中&#xff0c;如何定位慢查询&#xff1f; 发现了某个SQL语句执行很慢&#xff0c;如何进行分析&#xff1f; 了解过索引吗&#xff1f;(索引的底层原理)/B 树和B树的区别是什么&#xff1f; 什么是聚簇索引&#xff08;聚集索引&#xff09;和非聚簇索引…

Spring篇----第九篇

系列文章目录 文章目录 系列文章目录前言一、@Qualifier 注解有什么用?二、@RequestMapping 注解有什么用?三、spring DAO 有什么用?四、列举 Spring DAO 抛出的异常。前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到…

C# paddlerocrsharp识别身份证号

https://gitee.com/raoyutian/paddle-ocrsharp 项目搭建 新建控制台项目 安装paddleocrsharp 下载训练好的模型 解压放到对应的文件夹中&#xff0c;都修改为如果较新则复制 编写代码OCRHelper.cs using PaddleOCRSharp;namespace OCRTest02;public class OCRHelper {//…

基于Springboot + Vue 母婴商城系统

末尾获取源码作者介绍&#xff1a;大家好&#xff0c;我是墨韵&#xff0c;本人4年开发经验&#xff0c;专注定制项目开发 更多项目&#xff1a;CSDN主页YAML墨韵 学如逆水行舟&#xff0c;不进则退。学习如赶路&#xff0c;不能慢一步。 目录 一、项目简介 二、开发技术与环…

【iOS ARKit】网络传输 ARWorldMap

ARKit 可以利用 ARWorldMap 在应用中断后进行状态恢复、继续AR 进程。一个用户也可以将ARWorldMap 发送给其他用户&#xff0c;当其他用户接收并加载 ARWorldMap 后&#xff0c;就可以在相同的物理环境看到同样的虚拟元素&#xff0c;达到共享 AR体验的目的。 在ARKit 中&#…

面试redis篇-10Redis集群方案-主从复制

在Redis中提供的集群方案总共有三种: 主从复制哨兵模式分片集群主从复制 单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。 主从数据同步原理 Replication Id:简称replid,是数据集的标记,id一致则说明是同一数据集。每…

Python爬虫实战:从API获取数据

引言 在现代软件开发中&#xff0c;API已经成为获取数据的主要方式之一。API允许不同的软件应用程序相互通信&#xff0c;共享数据和功能。在本文中&#xff0c;我们将学习如何使用Python从API获取数据&#xff0c;并探讨其在实际应用中的价值。 目录 引言 二、API基础知识 …

Databend 开源周报第 133 期

Databend 是一款现代云数仓。专为弹性和高效设计&#xff0c;为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务&#xff1a;https://app.databend.cn 。 Whats On In Databend 探索 Databend 本周新进展&#xff0c;遇到更贴近你心意的 Databend 。 了解对开放表格…

【漏洞复现】若依系统后台任意文件读取漏洞

Nx01 产品简介 若依系统&#xff08;RuoYi&#xff09;是一套基于SpringBoot的权限管理系统&#xff0c;核心技术采用Spring、MyBatis、Shiro&#xff0c;众多政府、企业采用它作为某些系统的权限管理后台&#xff0c;使用率较高。 Nx02 漏洞描述 若依系统后台存在任意文件读取…

CV论文--2024.2.27

1、Co-Supervised Learning: Improving Weak-to-Strong Generalization with Hierarchical Mixture of Experts 中文标题&#xff1a;共同监督学习&#xff1a;通过专家的分层混合提高弱到强的泛化能力 简介&#xff1a;本文提出了一种新的方法来解决在互联网规模数据预训练的…

c入门第二十三篇: 学生成绩管理系统优化(支持远程操作)

前言 师弟高兴的说道&#xff1a;“师兄&#xff0c;你猜我今天上课看见谁了&#xff1f;” 我&#xff1a;“谁呢&#xff1f;” 师弟&#xff1a;“程夏&#xff0c;没想到&#xff0c;她竟然来旁听我们计算机系的课程了。虽然我从前门进去的&#xff0c;但是我还是一眼就看…

Rider 2023:打造高效.NET项目的智能IDE,让开发更简单mac/win版

JetBrains Rider 2023激活版下载是一款专为.NET开发者打造的强大集成开发环境&#xff08;IDE&#xff09;。这款IDE提供了丰富的功能&#xff0c;旨在帮助开发者更快速、更高效地编写、调试和测试.NET应用程序。 Rider 2023 软件获取 Rider 2023在保持了其一贯的智能代码补全…