windbg:设置断点 bp, bu, bm

在这里插入图片描述

bpbubm命令设置一个或多个软件断点。您可以组合位置、条件和选项来设置不同类型的软件断点。

本文中的调试代码示例如下:

#include <iostream>using namespace std;struct JKGirl{std::string name;int age;friend ostream& operator <<(ostream& o,const JKGirl& that){return o << that.name << " is " << that.age << " years old.";}
};int factorical(unsigned int n){static int result = 1;if(n <= 0 ) return result; // 递归结束条件result *= n;    // 算子return factorical(--n) ; // 递归
}int main()
{int num = 20;double f = 30.25;int result =  factorical(3);cout << result << endl;JKGirl girl = {"Anna",18};cout << girl << endl;return 0;
}

一、语法

用户模式

[~Thread] bp[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bu[ID] [Options] [Address [Passes]] ["CommandString"] 
[~Thread] bm [Options] SymbolPattern [Passes] ["CommandString"]

内核模式

bp[ID] [Options] [Address [Passes]] ["CommandString"] 
bu[ID] [Options] [Address [Passes]] ["CommandString"] 
bm [Options] SymbolPattern [Passes] ["CommandString"]

二、参数

Thread

指定要应用该断点的线程。该语法的更多信息,查看线程语法。只能在用户模式下指定线程。如果没有指定线程,则断点应用到所有线程。

ID

指定用于标识该断点的十进制数字。
调试器在创建断点时指派ID,但是之后可以通过 br (Breakpoint Renumber)命令来改变它。在其他调试器命令中使用ID来引用断点。要显示断点的ID,可以使用bl (Breakpoint List)命令。

在命令中使用ID时,不能在命令(bpbu)和ID号之间加入空格

ID 参数总是可选的。如果不指定ID,调试器使用第一个可用的断点号。内核模式下只能设置32个断点。用户模式下可以设置任意多个断点。但是哪种情况下对ID号的值都没有限制。如果使用中括号([])将ID括起来,ID可以包含任意表达式。

示例2.1: 通过bp添加设置自动生成 id 的断点;通过bl 指令查看设置的断点列表

0:000> bp WD01!main
0:000> bl0 e Disable Clear  00007ff7`247718a0     0001 (0001)  0:**** WD01!main

示例2.2: 通过bp添加设置指定 id号 的断点;通过bl 指令查看设置的断点列表

0:000> bp12 `WD01!main.cpp:42`      
0:000> bl0 e Disable Clear  00007ff7`247718a0     0001 (0001)  0:**** WD01!main12 e Disable Clear  00007ff7`24771932     0001 (0001)  0:**** WD01!main+0x92
bp12 `WD01!main.cpp:42`    指定在 main.cpp 的第42行设置断点

Options

指定断点选项。除非特别指出,可以设置任意数量的下面的选项:

选项描述
/1 创建一个一次性(“one-shot”)断点。该断点触发之后就会被从断点列表中永远去除。
/f PredNum(仅Itanium、仅用户模式) 指定一个断言号。该断点使用相应的断言寄存器(predicate register)进行判定(例如,bp /f 4 address设置一个使用p4断言寄存器进行判定的断点)。
/p EProcess(仅内核模式) 指定一个和该断点关联的进程。EProcess 必须是EPROCESS结构的实际地址,而不是PID。这种断点仅在指定的进程上下文内遇到的时候才会触发。
/t EThread(仅内核模式) 指定一个和断点关联的线程。EThread必须是ETHREAD结构的实际地址而不是线程ID。这种断点仅在指定的线程上下文内遇到的时候才会触发。如果同时使用/p EProcess 和/t EThread ,它们可以按任意顺序排列。
/c MaxCallStackDepth使得断点仅当调用堆栈小于MaxCallStackDepth 深度时才激活。不能将此选项和/C 组合使用。
/C MinCallStackDepth使得断点仅当调用堆栈大于MinCallStackDepth深度时才激活。不能将此选项和/c 组合使用。
/a(仅bm 使用) 在所有指定位置设置断点,不管他们在数据空间还是代码空间。由于数据上的断点可能造成程序错误,所以只能在确认安全的位置使用该选项。
/d(仅bm 使用) 将断点位置转换为地址。因此,如果代码位置改变了,这个断点还是保持在原来的位置,而不是像使用SymbolPattern 来设置的一样。使用/d 来避免模块加载或重加载时重新求值对断点进行的改变。
/((仅bm 使用) 在SymbolString 定义的符号字符串中包含参数列表信息。 这个功能使得可以对具有相同名字但是不同参数列表的重载函数设置断点。例如, bm /( myFunc 同时在myFunc(int a)和myFunc(char a)上设置断点。如果没有"/(",对myFunc 设置的断点会失败,因为这样不能确定断点设置到哪一个myFunc 上。

address

指定要设置断点处的指令的第一个字节位置。如果省略Address ,则使用当前指令指针。

Passes

指定断点激活之前要忽略的次数。调试器跳过该断点指定次数。该数字可以是任何16位或32位值。
默认情况下,断点在第一次执行断点位置的代码时被激活。这种默认情况和把Passes 设置为1是一样的。要使得断点在程序至少执行该代码一次之后才激活,可以将这个值设置为2或更大。例如,值为2时,使得断点在第二次执行到该代码时被激活。

该参数创建一个在每次执行断点处的代码时被减少1的计数器。要查看Passes 计数器的初始值和当前值,使用bl (Breakpoint List)。

Passes 仅当程序响应g (Go)命令并执行通过断点时才减少。单步或跟踪(tracing)通过它是不会减少的。当Passes 到达1时,可以通过清除并重设断点来重置它。

CommandString

指定每次遭遇断点指定次数后需要执行的命令列表。必须将CommandString 放到引号中。使用分号来分隔多条命令。
CommandString 中的调试器命令可以包含参数。可以使用标准C控制字符(如\n 和")。二级引号(")中的分号被当作引号中的字符串的一部分。

CommandString命令仅当程序响应g (Go)命令并执行通过断点时才会执行。单步或跟踪(tracing)执行断点处的命令时是不会触发的。
任何在中断后恢复程序运行的命令(如g 或t)都会结束命令列表的执行。

SymbolPattern

指定符号模板。调试器尝试使用已存在的符号来匹配该模板,并在所有匹配项上设置断点。SymbolPattern可以包含各种通配符和修饰符。该语法的更多信息,查看字符串通配符语法。因为这些字符时用来匹配符号的,这种匹配不区分大小写,并且 头部的单个下划线(_)表示任意数量的起始下划线。

三、注释

bpbubm 命令设置新断点,但是它们有不同的特点:

指令描述
bp (Set Breakpoint)命令在指定地址的断点位置上设置断点。如果设置断点时调试器还不能将地址表达式计算为断点位置,bp 断点被自动转换为bu 断点。使用bp 命令来设置在模块被卸载之后就不会再被激活的断点。
bu (Set Unresolved Breakpoint)命令设置延迟的或未定断点。bu 设置在命令中指定的符号引用的断点位置上(不是一个地址上),并且当所引用的模块能够确定时激活。
bm (Set Symbol Breakpoint)命令在能够匹配指定模板的符号上设置断点。该命令可以设置多于一个的断点。默认情况下,当模板被匹配之后,bm 断点和bu 断点相同。即bm 断点是针对符号引用设置的延迟断点。但是bm /d 命令会创建一个或多个bp断点。每个断点都被设置在能够匹配的位置的地址上,并且不会跟随模块状态改变。
  • 使用bp命令时,断点位置始终被转换成地址。如果bp 断点设置的代码被移动了,该断点仍然保持在相同位置并且可能指向不同的代码或者非法位置。

  • 相反的,bu 断点始终和命令指定的符号化的断点位置关联(一般是符号加上一个可选的偏移)。这种关联在符号的值改变或者包含该位置的模块加载或卸载之后仍然保持。

  • 使用bp 设置的断点会保持到使用bc (Breakpoint Clear)命令或WinDbg的Breakpoints 对话框移除为止。但是,因为这些断点指向的是一个地址,bp 断点在包含所引用的位置的模块卸载之后就不再有效了。

  • bu 设置的断点会保存在WinDbg工作空间中,但是bp 设置的断点不会保存。

  • 当使用鼠标在WinDbg的反汇编窗口或源码窗口中设置断点时,调试器创建bu断点。

  • bm 在想使用包含通配符的符号模板来设置断点时很有用。bm SymbolPattern 语法和使用x SymbolPattern然后对搜索结果使用bu 是一样的。例如,要在WD01模块中所有以字符串"factor"开头的符号上设置断点,可以使用如下命令。

0:000> bm WD01!factor*3: 00007ff7`24771850 @!"WD01!factorical"0:000> bl0 e Disable Clear  00007ff7`247718a0     0001 (0001)  0:**** WD01!main1 e Disable Clear  00007ff7`24771932     0001 (0001)  0:**** WD01!main+0x923 e Disable Clear  00007ff7`24771850     0001 (0001)  0:**** WD01!factorical

由于bm命令设置软断点(不是处理器断点),它会自动避开数据位置,以避免破坏数据。

但是,当使用bpbm /a时要小心。这些命令可以在数据段中设置软断点。调试器在代码上设置软断点时,会将处理器指令替换为中断指令。但是当调试器在数据段设置软断点时,会把数据替换为中断指令。这种中断指令会破坏数据。只有在只当作代码进行执行的数据上设置软件断点才是安全的。要在数据段设置断点,使用ba (Break on Access)命令。该命令可以设置数据断点而不是软件断点。

要在例如C++公有类这样的任意文本上设置断点,或者在operator new 函数上设置断点,需要将表达式括在圆括号中。例如,使用bp (??MyPublic) bp (operator new)

要在MASM表达式类型的任意文本上设置断点,使用bu @!"text"。要使用C++语法文本设置断点,对C++兼容的符号使用bu @@c++(text)

bpbubm命令通过将处理器命令替换为中断指令来设置软断点。要调试只读代码或不能改变的代码,使用ba e 命令,e用于设置执行访问。

如果单个逻辑代码行跨越了多个物理行,断点设置在语句或调用的最后一个物理行上。如果调试器在要求的位置不能设置断点,则会将断点放到下一个可用的位置上。

如果指定了Thread,断点设置在指定线程上。例如,~*bp在所有线程上设置断点, ~#bp在产生当前异常的线程上设置,而 ~123bp 在线程123上设置。~bp~.bp 命令都在当前线程设置断点。

在内核模是下调试多处理器系统时,使用bpba (Break on Access)设置的断点会应用到所有处理器。例如,如果当前处理器是3,并且输入bp MemoryAddress来在 MemoryAddress上设置了断点。任何执行到该地址的处理器都会产生断点陷阱。

例如:在示例代码中,factorical函数后4个字节的位置设置断点,忽略前两次,在第三次停下来。

0:000> bp WD01!factorical+0x04  2
0:000> bl0 e Disable Clear  00007ff7`247718a0     0001 (0001)  0:**** WD01!main1 e Disable Clear  00007ff7`24771932     0001 (0001)  0:**** WD01!main+0x922 e Disable Clear  00007ff7`24771854     0002 (0002)  0:**** WD01!factorical+0x4

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

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

相关文章

一文分清:Less、Sass、Scss、stylus,看看与css的对比

一、什么是css预处理器&#xff0c;有什么作用 CSS 预处理器是一种将预先定义的语法和功能添加到 CSS 中的工具。它们允许开发人员使用变量、嵌套规则、混合、继承等功能&#xff0c;以更高效和可维护的方式编写样式表。 CSS 预处理器的作用包括&#xff1a; 变量和计算&…

php项目中laravel框架下用postman调用接口实战总结

一.项目接口实战总结: 1.传参赋值错乱问题&#xff0c;如下&#xff1a; SQLSTATE[HY093]: Invalid parameter number (SQL: select count(*) as aggregate from cars where company_id 3345 and status ! 7 and user_id in (2148, 2060, 2061, 2432, 2136, 1970, 1987, 202…

【unity实战】实现实体子弹射击

文章目录 射击脚本新增子弹预制体子弹挂载脚本&#xff0c;实现触碰销毁子弹添加拖尾效果完结 射击脚本 public class Weapon : MonoBehaviour {public GameObject bulletPrefab; // 子弹预制体public Transform bulletSpawn; // 子弹生成位置public float bulletVelocity 30…

重构改善既有代码的设计-学习(三):重新组织数据

1、拆分变量&#xff08;Split Variable&#xff09; 有些变量用于保存一段冗长代码的运算结果&#xff0c;以便稍后使用。这种变量应该只被赋值一次。 如果它们被赋值超过一次&#xff0c;就意味它们在函数中承担了一个以上的责任。如果变量承担多个责任&#xff0c;它就应该被…

mac 修改flutter sdk配置

问题描述&#xff1a;我mac电脑上有高低2个版本的flutter sdk&#xff0c;我需要低版本sdk的项目在setting里设置了sdk版本&#xff0c;可是命令行还是提示我版本过高。 直接上解决办法&#xff1a; 打开mac终端&#xff0c;输入open -e .bash_profile&#xff0c;然后修改下…

【Java】SpringMVC参数接收(二):JSON、URI、文件

1、获取JSON参数 RequestMapping("/hello") RestController public class HelloSpring {RequestMapping("/t10")public String t10(RequestBody UserInfo userInfo){return userInfo.toString();} } 2、获取URI中的参数 &#xff08;1&#xff09;获取单…

手机耗电快怎么办?最全解析分享!

在现代社会&#xff0c;手机已经成为我们日常生活的重要伙伴&#xff0c;承载着通讯、娱乐、工作等多种功能。然而&#xff0c;随着手机功能的不断升级和使用频率的增加&#xff0c;许多人都曾经面临过一个普遍的问题&#xff1a;手机电池消耗过快。这不仅令人感到困扰&#xf…

B2B企业增长合集:10个案例4大策略深度解析

本文5300余字&#xff0c;静心阅读需要15分钟&#xff0c;建议收藏后再阅读。 现代管理学大师彼得德鲁克曾说&#xff1a;“不增长&#xff0c;一切都是成本。” 现实中的增长乏力和生存压力&#xff0c;迫使众多企业不得不寻求新的增长模式和增长渠道。 然而&#xff0c;增…

体育赛事编排管理系统设计与实现 -计算机毕业设计源码59094

目 录 摘要 1 绪论 1.1研究背景与意义 1.2研究内容 1.3springboot框架介绍 1.4论文结构与章节安排 2 体育赛事编排管理系统系统分析 2.1 可行性分析 2.1.1 技术可行性分析 2.1.2 经济可行性分析 2.1.3 法律可行性分析 2.2 系统功能分析 2.2.1 功能性分析 2.2.2 非…

基本语法和 package 与 jar

3.基本语法 1.输入输出 // 导入 java.util 包中的 Scanner 类 import java.util.Scanner;// 定义名为 ScannerExample 的公共类 public class ScannerExample {// 主方法&#xff0c;程序的入口点public static void main(String[] args) {// 创建 Scanner 对象&#xff0c;用…

VMware虚拟机安装优麒麟(ubuntukylin)操作系统

1.镜像下载 官网:https://www.ubuntukylin.com/ 优麒麟官网提供的宣传视频:https://www.ubuntukylin.com/upload/video/202204/1650594049260581.mp4官网提供的视频后续随着版本的更新,此视频可能失效,去官网查看最新的即可,这不是重点 1.1搜索出优麒麟官网,下载镜像 下载…

Flutter中实现中国省份地图

效果展示(这里只展示局部&#xff0c;完全展示违规)&#xff1a; 可以点击省份改变颜色&#xff0c;更多功能可以自行拓展。 注&#xff1a;非完整中国地图&#xff01;&#xff01;&#xff01; 本文用于记录在Flutter项目中安卓端实现中国地图&#xff0c;因为实现过程是通过…

微软 AD 介绍 | 安全建议 | 防护

介绍&#xff1a; 什么是Active Directory&#xff08;AD&#xff09;&#xff1f; Active Directory 是由 微软开发的目录服务&#xff0c;用于存储和管理网络中的资源&#xff0c;如计算机、用户、组和其他网络对象。允许组织管理员轻松地管理和验证网络中的用户和计算机。 …

【C++】stack、queue的使用及模拟实现

目录 一、stack1.1 stack的使用1.2 stack的模拟实现 二、queue2.1 queue的使用2.2 queue的模拟实现 一、stack 1.1 stack的使用 stack是一种容器适配器&#xff0c;它的特点是后进先出&#xff0c;只能在容器的一端进行插入和删除操作。 stack的使用很简单&#xff0c;主要有…

卫星影像离线瓦片如何调用?

我们曾为你分享了按区县购买卫星影像并在线调用的方法。 于是就有朋友问&#xff0c;卫星影像瓦片可以离线调用吗&#xff1f; 当然可以&#xff0c;这里就来分享一下卫星影像瓦片离线调用的方法。 卫星影像离线瓦片如何调用&#xff1f; 这里以OpenLayers、Mapbox和Cesiu…

安卓移动设备使用DS file文件管理工具远程访问本地群晖NAS文件

文章目录 1. 群晖安装Cpolar2. 创建TCP公网地址3. 远程访问群晖文件4. 固定TCP公网地址5. 固定TCP地址连接6. 结语 DS file 是一个由群晖公司开发的文件管理应用程序&#xff0c;主要用于浏览、访问和管理存储在群晖NAS&#xff08;网络附加存储&#xff09;中的文件。这个应用…

搭建nodejs服务器

简单搭建nodejs服务器&#xff0c;用于爬虫js逆向. 1、安装镜像源 下载nrm npm install -g nrm 设置下载源&#xff1a;&#xff08;最好使用npm源或者淘宝源&#xff09; 例子&#xff1a;npm config set registry http://registry.npmjs.org 查看是否设置成功&#xff1a…

Mac 也能玩文明6!下载安装详细教程

最近朋友给我分享了一个 Mac 玩文明6的方法&#xff0c;丝毫不卡顿&#xff0c;非常流畅&#xff0c;分享给大家 文明6是最新的文明系列游戏&#xff0c;和以往的文明游戏一样&#xff0c;玩家将从石器时代创建文明&#xff0c;然后迈向信息时代&#xff0c;最终通过军事、经济…

考研C语言刷题基础篇之数组(一)

目录 第一题&#xff1a;用数组作为参数实现冒泡排序 不用函数的冒泡排序 冒泡排序原理&#xff1a; 错误的数值传参冒泡排序 错误的原因 就是什么是数组名 正确的数组传参的冒泡排序 数组的地址和数组首元素的地址的区别 第一题&#xff1a;用数组作为参数实现冒泡排…

Docker网络配置与自定义IP容器通信

目录 前言 一、docker网络配置 1. bridge 虚拟网桥 2. host 网络模式 3. none 网络模式 4. 自定义container网络模式 二、自定义IP容器通信 1. 自定义IP 2. 创建所需容器&#xff08;mysql&#xff0c;tomcat&#xff09; 3. 准备项目资源 4. 构建Nginx实现负载均衡…