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.hqwc.cn/news/496385.html

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

相关文章

Kafka安全模式之身份认证

一、简介 Kafka作为一个分布式的发布-订阅消息系统&#xff0c;在日常项目中被频繁使用&#xff0c;通常情况下无论是生产者还是消费者只要订阅Topic后&#xff0c;即可进行消息的发送和接收。而kafka在0.9.0.0版本后添加了身份认证和权限控制两种安全服务&#xff0c;本文主要…

transformer--编码器(掩码张量、注意力机制、多头注意力机制)

编码器部分: 由N个编码器层堆叠而成每个编码器层由两个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接。第二个子层连接结构包括一个前馈全连接子层和规范化层以及一个残差连接 掩码张量 什么是掩码张量 掩代表遮掩&#xff0c;码…

【C++干货基地】C++:函数重载(深度解析Windows和Linux下函数的修饰规则)

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 哈喽各位铁汁们好啊&#xff0c;我是博主鸽芷咕《C干货基地》是由我的襄阳家乡零食基地有感而发&#xff0c;不知道各位的…

HarmonyOS—使用数据模型和连接器

Serverless低代码开发平台是一个可视化的平台&#xff0c; 打通了HarmonyOS云侧与端侧能力&#xff0c;能够轻松实现HMS Core、AGC Serverless能力调用。其中&#xff0c;数据模型和连接器是两大主要元素。开发者在使用DevEco Studio的低代码功能进行开发时&#xff0c;可以使用…

(案例贴1)html+js+css todolist便签条

版本1&#xff1a;静态壁纸背景 版本二&#xff1a;动态小球跳动背景 f86084d896df68b0ba2e64467afe4983_raw html代码&#xff1a; <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport…

武器大师——操作符详解(上)

目录 一、操作符的分类 二、二进制和进制转换 2.1.二进制与十进制的互相转化 2.1.1 二进制转十进制 2.1.2 十进制转二进制 ​编辑 2.2.二进制转8进制和16进制 2.2.1 转8进制 2.2.2 转16进制 三、原码、反码、补码 四、移位操作符 4.1.左移操作符&#xff08;<…

备战蓝桥杯————如何判断回文链表

如何判断回文链表 题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a;…

计算机网络:深入探索HTTP

引言&#xff1a; HTTP&#xff0c;全称超文本传输协议&#xff08;Hypertext Transfer Protocol&#xff09;&#xff0c;是互联网上数据通信的基础。它定义了客户端&#xff08;如浏览器&#xff09;和服务器之间如何交互和传输数据。HTTP最初是为了支持Web浏览而设计的&…

SpringMVC 学习(八)之文件上传与下载

目录 1 文件上传 2 文件下载 1 文件上传 SpringMVC 对文件的上传做了很好的封装&#xff0c;提供了两种解析器。 CommonsMultipartResolver&#xff1a;兼容性较好&#xff0c;可以兼容 Servlet3.0 之前的版本&#xff0c;但是它依赖了 commons-fileupload …

数据结构:栈和队列与栈实现队列(C语言版)

目录 前言 1.栈 1.1 栈的概念及结构 1.2 栈的底层数据结构选择 1.2 数据结构设计代码&#xff08;栈的实现&#xff09; 1.3 接口函数实现代码 &#xff08;1&#xff09;初始化栈 &#xff08;2&#xff09;销毁栈 &#xff08;3&#xff09;压栈 &#xff08;4&…

Gradle exclude排除指定依赖的办法

举例 implementation (com.squareup.picasso:picasso:2.71828){ exclude module: support-v4 exclude group: com.android.support } 说明&#xff1a;引用 Picasso库&#xff0c;需要排除 support-v4&#xff0c;其他库已经引用了support-v4。 解释 com.squareup.…

【MySQL】DQL

DQL&#xff08;数据查询语言&#xff09;用于在MySQL数据库中执行数据查询操作。它主要包括SELECT语句&#xff0c;用于从表中检索数据。 0. 基本语法 SELECT 字段列表 FROM 表名列表 WHERE 条件列表 GROUP BY 分组字段列表 HAVING 分组后条件列表 ORDER BY 排序字段列表 …