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

文章目录

  • 在程序地址上打断点
  • 在程序入口处打断点
    • 获取程序入口地址
  • 在命名空间设置断点
    • 命名空间
    • 给命名空间的函数下断电
  • 在文件行号上打断点
  • 保存已经设置的断点
  • 设置临时断点
  • 设置条件断点
    • 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.mzph.cn/news/709035.shtml

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

相关文章

【扩散模型第三篇】Classifier Guidance 和 Classifier Free Guidance(CFG)

参考&#xff1a; [1] 张振虎博客 [2] https://www.bilibili.com/video/BV1s8411i7cU/?spm_id_from333.788&vd_source9e9b4b6471a6e98c3e756ce7f41eb134 [3] https://zhuanlan.zhihu.com/p/660518657 [4] https://zhuanlan.zhihu.com/p/640631667 进食顺序 1 前言2 Classi…

【c++】stack和queue模拟实现

> 作者简介&#xff1a;დ旧言~&#xff0c;目前大二&#xff0c;现在学习Java&#xff0c;c&#xff0c;c&#xff0c;Python等 > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;能手撕stack和queue模拟 > 毒鸡汤&#xff1a;…

DataGrip2023配置连接Mssqlserver、Mysql、Oracle若干问题解决方案

1、Mssqlserver连接 本人连的是Sql2008&#xff0c;默认添加时&#xff0c;地址、端口、实例、账号、密码后&#xff0c;测试连接出现错误。 Use SSL&#xff1a;不要勾选 VM option&#xff1a;填写&#xff0c;"-Djdk.tls.disabledAlgorithmsSSLv3, RC4, DES, MD5withR…

【Redis | 第五篇】一篇文章看懂布谷鸟过滤器

文章目录 5.布谷鸟过滤器5.1起源介绍5.2原理5.2.1演示步骤&#xff08;1&#xff09;保存元素&#xff08;两个位置均为空&#xff09;&#xff08;2&#xff09;保存元素&#xff08;其中一个位置被占&#xff09;&#xff08;3&#xff09;保存元素&#xff08;两个位置都被占…

Linux小项目:在线词典开发

在线词典介绍 流程图如下&#xff1a; 项目的功能介绍 在线英英词典项目功能描述用户注册和登录验证服务器端将用户信息和历史记录保存在数据中。客户端输入用户和密码&#xff0c;服务器端在数据库中查找、匹配&#xff0c;返回结果单词在线翻译根据客户端输入输入的单词在字…

轻松玩转Git

轻松玩转Git 快速入门什么是Git为什么要做版本控制安装git Git实战单枪匹马开始干拓展新功能小结 紧急修复bug分支紧急修复bug方案命令总结工作流 上传GitHub第一天上班前在家上传代码初次在公司新电脑下载代码下班回到家继续写代码到公司继续开发在公司约妹子忘记提交代码回家…

CDH6.3.1离线安装

一、从官方文档整体认识CDH 官方文档地址如下&#xff1a; CDH Overview | 6.3.x | Cloudera Documentation CDH是Apache Hadoop和相关项目中最完整、测试最全面、最受欢迎的发行版。CDH提供Hadoop的核心元素、可扩展存储和分布式计算&#xff0c;以及基于Web的用户界面和重…

蓝桥杯备战刷题three(自用)

1.合法日期 #include <iostream> #include <map> #include <string> using namespace std; int main() {map<string,int>mp;int days[13]{0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i1;i<12;i){for(int j1;j<days[i];j){string sto_strin…

Vivado Vitis 2023.2 环境配置 Git TCL工程管理 MicroBlaze和HLS点灯测试

文章目录 本篇概要Vivado Vitis 环境搭建Vivado 免费标准版 vs 企业版Vivado Windows 安装Vivado 安装更新 Vivado 工程操作GUI 创建工程打开已有工程从已有工程创建, 重命名工程GUI导出TCL, TCL复原工程TCL命令 Vivado 版本控制BlinkTcl脚本新建导出重建工程纯Verilog BlinkTc…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解

一、分析判断 进入靶机&#xff0c;主页面如图&#xff1a; 主页面提供给我们一条关键信息&#xff1a; flag值在 表flag 中的 flag列 中。 接着我们尝试输入不同的id&#xff0c;情况分别如图&#xff1a; 当id1时&#xff1a; 当id2时&#xff1a; 当id3时&#xff1a; 我…

YOLOv8改进涨点,添加GSConv+Slim Neck,有效提升目标检测效果,代码改进(超详细)

目录 摘要 主要想法 GSConv GSConv代码实现 slim-neck slim-neck代码实现 yaml文件 完整代码分享 总结 摘要 目标检测是计算机视觉中重要的下游任务。对于车载边缘计算平台来说&#xff0c;巨大的模型很难达到实时检测的要求。而且&#xff0c;由大量深度可分离卷积层构…

C++:常量表达式

C11开始constexpr作为一种声明&#xff0c;为编译器提供了在编译期间确认结果的优化建议&#xff0c;满足部分编译期特性的需求 constexpr和const区别 int b10; const int ab; //运行成功 constexpr int cb; //编译器报错&#xff0c;b的值在编译期间不能确定 const int size1…

面试笔记系列二之java基础+集合知识点整理及常见面试题

目录 Java面向对象有哪些特征&#xff0c;如何应用 Java基本数据类型及所占字节 Java中重写和重载有哪些区别 jdk1.8的新特性有哪些 内部类 1. 成员内部类&#xff08;Member Inner Class&#xff09;&#xff1a; 2. 静态内部类&#xff08;Static Nested Class&#…

Vue 组件和插件:探索细节与差异

查看本专栏目录 关于作者 还是大剑师兰特&#xff1a;曾是美国某知名大学计算机专业研究生&#xff0c;现为航空航海领域高级前端工程师&#xff1b;CSDN知名博主&#xff0c;GIS领域优质创作者&#xff0c;深耕openlayers、leaflet、mapbox、cesium&#xff0c;canvas&#x…

Linux查看进程占用句柄

ps -ef |grep python # 查找工具执行PID python pid 11287lsof -p 11287 |wc -l 查看进程占用句柄设置句柄上限IOError: [Errno 24] Too many open files:解决方法

阿里云短信验证笔记

1.了解阿里云的权限操作 进入AccessKey管理 选择子用户 创建用户组和用户 先创建用户组&#xff0c;建好再进行权限分配 添加短信管理权限 创建用户 创建好后的id和密码在此处下载可以得到 2.开通阿里云短信服务 进行申请&#xff0c;配置短信模板 阿里云短信API文档 短信服务…

逆向案例三:动态xhr包中AES解密的一般步骤,以精灵数据为例

补充知识&#xff1a;进行AES解密需要知道四个关键字&#xff0c;即密钥key,向量iv,模式mode,填充方式pad 一般网页AES都是16位的&#xff0c;m3u8视频加密一般是AES-128格式 网页链接:https://www.jinglingshuju.com/articles 进行抓包结果返回的是密文&#xff1a; 一般思…

【算法大家庭】分治算法

目录 &#x1f953;1.简单介绍 &#x1f9c8;2.汉诺塔问题 1.简单介绍 分治算法是解决问题的一种思想&#xff0c;它将一个大问题分解成若干个小问题&#xff0c;然后分别解决这些小问题&#xff0c;最后将小问题的解合并起来得到原问题的解。 分解&#xff1a;将原问题分解…

Mazing官方 2.17.17版新i功能介绍

iMazing官方 2.17.17版是一款管理苹果设备的软件&#xff0c;是一款帮助用户管理 IOS 手机的PC端应用程序&#xff0c;能力远超 iTunes 提供的终极 iOS 设备管理器。在iMazing官方版上与苹果设备连接后&#xff0c;可以轻松传输文件&#xff0c;浏览保存信息等&#xff0c;功能…

SD-WAN对云服务的影响

近年来&#xff0c;随着企业对云服务的依赖不断增加&#xff0c;SD-WAN技术成为提升连接性能的热门选择。SD-WAN通过简化云集成和连接&#xff0c;以及提升应用程序性能&#xff0c;为企业带来显著的业务优势。这种云连接的改进使企业能够更轻松地接触全球劳动力和潜在客户。 首…