软件断点和硬件断点

文章目录

  • 硬件断点
      • 处理器断点(ba 断点)
      • 软件断点
      • 处理器断点与软件断点的比较
      • 设置处理器断点
      • 示例
      • 注意事项
  • 软件断点
      • 1. `bp`(Break Point)
      • 2. `bu`(Break on Unloaded)
      • 3. `bm`(Break on Match)
      • 示例
      • 注意事项
  • 软件断点实现寄存器监控


硬件断点

处理器断点(也称为硬件断点或数据断点)和软件断点是调试过程中用来暂停程序执行的两种主要类型的断点。它们各有不同的工作方式和用途。

处理器断点(ba 断点)

处理器断点是由处理器硬件支持的断点,它们在访问特定内存位置时触发。处理器断点有四种类型:

  • e(执行):当处理器尝试从指定地址执行指令时触发。
  • r(读取/写入):当处理器读取或写入指定地址的内存时触发。
  • w(写入):仅当处理器写入指定地址的内存时触发。
  • i(I/O):在访问指定地址的 I/O 端口时触发(仅在内核模式调试时可用)。

处理器断点的大小可以是1、2、4或8字节,取决于处理器和调试器的支持。这些断点适用于所有处理器,无论是在用户模式还是内核模式下。

软件断点

软件断点是由调试器控制的断点。当调试器在某个位置设置软件断点时,它会用断点指令(如 int 3)暂时替换该内存位置的内容。当目标进程执行该位置的代码时,中断指令会使进程进入调试器中。软件断点通常用于可执行代码,但也可以在数据位置设置,尽管这可能导致数据损坏。

处理器断点与软件断点的比较

  • 处理器断点

    • 由处理器硬件支持,不依赖于调试器。
    • 适用于监控数据访问和I/O操作。
    • 数量有限,通常由处理器的调试寄存器数量决定。
    • 不会修改被调试程序的代码。
  • 软件断点

    • 由调试器控制,通过修改程序代码实现。
    • 适用于任何可执行代码。
    • 数量几乎不受限制,但需要足够的内存来存储断点信息。
    • 可能会修改程序的可执行代码。

设置处理器断点

在 WinDbg 中,使用 ba 命令设置处理器断点:

ba [Options] AccessType Size Address [Command]
  • Options:可选参数,如 /1 表示一次性断点。
  • AccessType:指定要监控的内存访问类型(e、r、w、i)。
  • Size:指定要监控的内存大小。
  • Address:指定要监控的内存地址。
  • Command:可选参数,指定当断点触发时要执行的命令。

示例

设置一个写入处理器断点,监控4字节的写入操作:

ba w 4 0000022f`d3e30600

这个命令在地址 0000022fd3e30600` 处设置一个写入处理器断点,监控4字节的写入操作。

注意事项

  • 处理器断点的数量有限,通常由处理器的调试寄存器数量决定。
  • 处理器断点适用于所有处理器,无论是在用户模式还是内核模式下。
  • 在多处理器系统上,处理器断点适用于所有处理器。
  • 处理器断点存储在处理器的调试寄存器中,可以通过手动编辑调试寄存器的值来设置断点,但强烈建议不要这样做。

通过理解处理器断点和软件断点的不同特点和用途,你可以更有效地使用它们来调试程序。处理器断点特别适合于监控数据访问和I/O操作,而软件断点则适合于调试可执行代码。


软件断点

在 WinDbg 中,bpbubm 命令都用于设置断点,但它们各有不同的特点和用途。这些断点对于调试程序非常有用,因为它们允许你在特定的代码位置暂停程序执行,从而可以检查程序的状态和变量。

1. bp(Break Point)

bp 命令用于在指定的地址设置一个软件断点。当程序执行到这个地址时,它会暂停。这个命令通常用于那些你已经知道确切地址的断点。

语法

[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"]
  • Thread:指定断点适用的线程。只在用户模式下有效。
  • ID:断点的标识符,可以自定义,也可以让调试器自动分配。
  • Options:断点的选项,如 /1 表示一次性断点,触发后自动删除。
  • Address:设置断点的内存地址。
  • Passes:指定断点触发的次数,例如,设置为 2 表示在第二次执行到该地址时才触发断点。
  • CommandString:断点触发时执行的命令,如打印寄存器值或继续执行。

2. bu(Break on Unloaded)

bu 命令用于设置一个未解析的断点。这种断点在符号加载时才会被解析。这在你不确定模块何时会被加载,或者模块尚未加载时非常有用。

语法

[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"]

bp 命令的参数相同,但 bu 断点在模块加载时才会被解析和激活。

3. bm(Break on Match)

bm 命令用于在与指定模式匹配的符号上设置断点。这可以一次性在多个位置设置断点,非常适合于你想要监控多个函数或方法时。

语法

bm [Options] SymbolPattern [Passes] ["CommandString"]
  • SymbolPattern:符号模式,可以包含通配符,如 myprogram!* 会在 myprogram 模块的所有函数上设置断点。
  • Options:包括 /d(将断点位置转换为地址),/((包括参数列表信息)等。

示例

  • 设置断点

    bp kernel32!WriteFile
    

    kernel32.dllWriteFile 函数上设置断点。

  • 设置未解析的断点

    bu mymodule!MyFunction
    

    mymoduleMyFunction 上设置断点,即使模块尚未加载。

  • 在多个函数上设置断点

    bm mymodule!*Init*
    

    mymodule 模块中所有包含 “Init” 的函数上设置断点。

注意事项

  • 断点数量:在用户模式下可以设置任意数量的断点,但在内核模式下最多只能设置32个断点。
  • 断点类型bpbu 设置的是软件断点,而 ba 设置的是硬件断点(访问断点)。
  • 断点持久性bp 断点不会保存在 WinDbg 工作区中,而 bu 断点会保存。

通过这些命令,你可以非常灵活地控制程序的执行,以便在关键点检查程序状态,这对于诊断复杂的程序行为和错误非常有帮助。


软件断点实现寄存器监控

要用软件断点代替处理器断点(ba 命令设置的)来监控4字节的写入操作,你可以使用 bp(设置断点)命令在特定的写入函数上设置断点,然后在断点命中的时候检查写入的值和地址。软件断点是通过将断点处的指令替换为中断指令(如 int 3)来实现的。

然而,软件断点通常用于在代码执行时暂停程序,而不是监控数据的写入。如果要监控特定内存地址的写入操作,处理器断点(使用 ba 命令设置)通常是更直接和有效的选择。但如果你想要使用软件断点来间接实现这一目的,你可以考虑以下方法:

  1. 找到写入内存的函数:确定哪些函数负责写入你想要监控的内存地址。例如,在Windows API中,可能涉及到 WriteProcessMemory 或其他类似的函数。

  2. 在这些函数上设置软件断点:使用 bp 命令在这些函数的入口处设置软件断点。

    bp kernel32!WriteProcessMemory
    
  3. 检查函数参数:当断点命中时,检查传递给函数的参数,确定它们是否与你想要监控的内存地址和大小相匹配。

  4. 使用条件断点:可以设置条件断点,仅在特定条件下(例如,当特定的内存地址被写入时)才触发。

    bp kernel32!WriteProcessMemory "j (@rcx==0000022f`d3e30600) '.printf \"Write to address %p\", @rcx; g' ; 'g'"
    

    这个命令的意思是,如果 WriteProcessMemory 的第一个参数(在 rcx 寄存器中)等于你想要监控的地址,则打印一条消息并继续执行。否则,直接继续执行。

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

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

相关文章

【数据结构】10.线索二叉树

一、线索二叉树的产生 采用先序、中序、后序三种方法遍历二叉树后都可以得到一个线性序列,序列上的每一个结点(除了第一个和最后一个)都有一个前驱和一个后继,但是,这个线性序列只是逻辑的概念,不是物理结…

如何合理设计一套springcloud+springboot项目中的各个微服务模块之间的继承关系的最优方案

文章目录 一、模块化设计所遵循的原则二、项目架构设计三、各个模块作用说明3.1 core 模块3.2 common 模块3.3 generatorcode模块3.4 business 模块3.5 web 模块3.6 admin 模块3.7 父pom 四、采用import引入SpringBoot 在springcloud微服务项目中经常用到多模块化的架构设计&am…

HarmonyOS4+NEXT星河版入门与项目实战--------开发工具与环境准备

文章目录 1、熟悉鸿蒙官网1、打开官网2、下载 DevEco Studio3、HarmonyOS 资源库4、开发指南与API 2、安装 DevEco Studio1、软件安装2、配置开发工具 1、熟悉鸿蒙官网 1、打开官网 百度搜索 鸿蒙开发者官网 点击进入开发者官网,点击开发,可以看到各种…

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法: 注意事项: 2.集成测试 需注意事项: 实现集成测试的方法: 如何实现高效且可靠的集成测试: 3.系统测试 实现系统测试的方法: 须知注意事项: 4.验收测试 实现验…

Ubuntu24 上安装搜狗输入法

link 首先在终端中依次输入以下代码 sudo apt update sudo apt install fcitx 找到语言支持 在终端中依次输入 sudo cp /usr/share/applications/fcitx.desktop /etc/xdg/autostart/ sudo apt purge ibus 进入网页 搜狗输入法linux-首页​ shurufa.sogou.com/linux 找到刚才下…

FairyGUI和Unity联动(入门篇)

一、FairyGUI编辑器中 1.新建按钮、新建组件 编辑器中界面简易设计如下 2.文件-发布设置-发布路径:自己unity项目Resources所在的路径 二、Unity 使用代码展示UI using FairyGUI; using System.Collections; using System.Collections.Generic; using UnityEngi…

【Java知识】Java性能测试工具JMeter

一文带你了解什么是JMeter 概述JMeter的主要功能:JMeter的工作原理:JMeter的应用场景:JMeter的组件介绍: 实践说明JMeter实践基本步骤:JMeter实践关键点: JMeter支持哪些参数化技术?常见插件及其…

Redis的缓存穿透、缓存雪崩、缓存击穿问题及有效解决方案

目录 一、缓存穿透 1.简介 2.解决方案 3.修改前的代码 4.修改过后的代码 二、缓存雪崩 1.简介 2.解决方案 三、缓存击穿 1.简介 2.解决方案 3.用代码来实现互斥锁来解决缓存击穿 4.用代码来实现逻辑过期解决缓存击穿 四、缓存穿透和缓存击穿的区别 一、缓存穿透 …

CPU的性能指标总结(学习笔记)

CPU 性能指标 我们先来回顾下,描述 CPU 的性能指标都有哪些。 首先,最容易想到的应该是 CPU 使用率,这也是实际环境中最常见的一个性能指标。 用户 CPU 使用率,包括用户态 CPU 使用率(user)和低优先级用…

【go从零单排】Environment Variables环境变量

🌈Don’t worry , just coding! 内耗与overthinking只会削弱你的精力,虚度你的光阴,每天迈出一小步,回头时发现已经走了很远。 📗概念 在 Go 语言中,环境变量是用于配置程序行为的一种常见方式。它们可以用…

信捷PLC转以太网连接电脑方法

信捷XC/XD/XL等系列PLC如何上下载程序?可以选择用捷米特JM-ETH-XJ模块轻松搞定,并不需要编程,即插即用,具体看见以下介绍: 产品介绍 捷米特JM-ETH-XJ是专门为信捷PLC转以太网通讯面设计,可实现工厂设备信息化需求,对…

【golang-技巧】-线上死锁问题排查-by pprof

1.背景 由于目前项目使用 cgo golang 本地不能debug, 发生死锁问题,程序运行和期待不一致,通过日志排查可以大概率找到 阻塞范围,但是不能找到具体问题在哪里,同时服务器 通过k8s daemonset 部署没有更好的方式暴露端口 获取ppr…

AVL树的删除方法简单实现

看过前面的AVL树的介绍和插入方法实现AVL树了解并简单实现-CSDN博客,接着可以来学习删除方法的实现 目录 1.AVL树的删除 2.平衡因子调节 3.删除代码逻辑 4.AVL树的整体代码 1.AVL树的删除 因为AVL树也是二叉搜索树,可按照二叉搜索树的方式将节点删除…

ArcGIS的汉字(亚洲文本)垂直标注

01 需求说明 实现ArcGIS的汉字(亚洲文本的垂直标注)。 启用 Maplex 标注引擎。 在标注 工具条上单击标注管理器按钮 。 选中要进行标注的图层旁边的复选框。 选择图层下方的标注分类。 单击符号。 选中 CJK 字符方向复选框。 仅当字体有垂直的文本度…

飞凌嵌入式RK3576核心板已适配Android 14系统

在今年3月举办的RKDC2024大会上,飞凌嵌入式FET3576-C核心板作为瑞芯微RK3576处理器的行业首秀方案重磅亮相,并于今年6月率先量产发货,为客户持续稳定地供应,得到了众多合作伙伴的认可。 FET3576-C核心板此前已提供了Linux 6.1.57…

基于python的dlib库的人脸识别实现

1、环境搭建 基于dlib库的人脸识别环境配置需求如下: conda create -n dlibFace python3.6.4 conda activate dlibFacepip install dlib19.8.1 pip install opencv-python3.4.1.15 pip install tqdm 安装如下: 2、模块介绍 2.1 源代码下载 源代码点击:下载源代码 2.2 源码…

Ubuntu问题 -- 允许ssh使用root用户登陆

目的 新重装的系统, 普通用户可以使用ssh登陆服务器, 但是root不能使用ssh登陆 方法 vim 编辑ssh配置文件 sudo vim /etc/ssh/sshd_config找到 PermitRootLogin 这一行, 把后面值改成 yes 重启ssh sudo service sshd restart然后使用root账号登陆即可

DAY6 线程

作业1&#xff1a; 多线程实现文件拷贝&#xff0c;线程1拷贝一半&#xff0c;线程2拷贝另一半&#xff0c;主线程回收子线程资源。 代码&#xff1a; #include <myhead.h> sem_t sem1; void *copy1()//子线程1函数 拷贝前一半内容 {int fd1open("./1.txt",O…

第六十四周周报 TCN-LSTM

文章目录 week 64 TCN-LSTM摘要Abstract1. 题目2. Abstract3. 文献解读3.1 Introduction3.2 创新点 4. 网络结构4.1 数据分析4.2 混合深度学习框架的开发 5. 实验结果6.结论 week 64 TCN-LSTM 摘要 本周阅读了题为A hybrid deep learning approach to improve real-time effl…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因&#xff1a; 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常&#xff0c;SpringBootTest注解用于加载 Spring Boot 应用上下文&#xff0c;但它需要找到一个带有SpringBootConfiguration&#xff08;或者Configuration&am…