Windbg命令的语法规则系列(三)
五、源文件行语法
可以将源文件行号指定为MASM表达式的全部或部分。这些数字计算出与该源代码行对应的可执行代码的偏移量。不能使用源代码行作为C++表达式的一部分。必须用重音符(`)将源文件和行号表达式括起来。以下示例显示源文件行号的完整格式。
`[[Module!]Filename][:LineNumber]`
如果有多个文件具有相同的文件名,则文件名应包括整个目录路径和文件名。此目录路径应该是编译时使用的路径。如果只提供文件名或路径的一部分,并且存在多个匹配项,则调试器将使用找到的第一个匹配项。如果省略了文件名,调试器将使用与当前程序计数器对应的源文件。除非在行号前面加上0x,否则行号将作为十进制数读取,而不考虑当前的默认基数。如果省略了linenumber,表达式将计算出与源文件对应的可执行文件的初始地址。除非发出.lines(切换源行支持)命令或在启动windbg时包含-lines命令行选项,否则不会在cdb中计算源行表达式。
六、地址和地址范围语法
在调试器中有几种指定地址的方法。地址始终是虚拟地址,除非文档专门指明另一种地址。在用户模式下,调试器根据当前进程的页目录解释虚拟地址。在内核模式下,调试器根据进程上下文指定的进程页目录解释虚拟地址。还可以直接设置用户模式地址上下文。
6.1、地址模式和段支持
在基于x86的平台上,CDB和KD支持以下寻址模式。这些模式通过前缀来区分。
前缀 | 名称 | 地址类型 |
---|---|---|
% |
平坦 |
32 位地址 (也 16 位选择器,指向 32 位段) 和 64 位系统上的 64 位地址。 |
& |
virtual 86 |
实模式地址。 基于 x86 的仅。 |
# |
纯 |
实模式地址。 基于 x86 的仅。 |
普通模式和虚拟模式86的区别在于普通16位地址使用段值作为选择器,并查找段描述符。但一个虚拟的86地址不使用选择器,而是直接映射到较低的1 MB中。如果通过不是当前默认模式的寻址模式访问内存,则可以使用地址模式前缀覆盖当前地址模式。
6.2、地址参数
地址参数指定变量和函数的位置。下表说明了可以在CDB和KD中使用的各种地址的语法和含义。
语法 | 含义 |
---|---|
offset |
虚拟内存空间,含对应于当前的执行模式的类型中的绝对地址。 例如,如果当前的执行模式是 16 位,偏移量为 16 位。 如果执行模式是 32 位分段,偏移量为 32 位分段。 |
&[[段:]] 偏移量 |
实际地址。 基于 x86 和基于 x64 的。 |
%segment:[[ offset]] |
分段的 32 位或 64 位地址。 基于 x86 和基于 x64 的。 |
%[[偏移量]] |
一个绝对地址 (32 位或 64 位) 的虚拟内存空间中。 基于 x86 和基于 x64 的。 |
name[[ +|− ]] offset |
一个平面 32 位或 64 位地址。 名称可以是任何符号。 偏移量指定的偏移量。 此偏移量可以是任何其前缀表示的地址模式。 无前缀指定默认模式地址。 您可以指定偏移量为正 (+) 或负值 (−)。 |
使用dg (Display Selector)命令查看段描述符信息。在MASM表达式中,还可以使用POI运算符取消对任何指针的引用。例如,如果地址0x00123456处的指针指向地址位置0x004200,则以下两个命令是等效的。
:> dd
:> dd poi()
在C++表达式中,指针就像C++中的指针一样。然而,数字被解释为整数。如果必须遵从实际数字,则必须首先对其进行强制转换,如下例所示
:> dd *( (long*) 0x123456 )
一些伪寄存器还保存着公共地址,例如当前程序计数器位置。还可以通过指定原始源文件名和行号来指示应用程序中的地址。
6.3、地址范围
0x00001000 0x00001007
要通过地址和对象计数指定地址范围,请指定地址参数、字母L(大写或小写)和值参数。地址指定起始地址。该值指定要检查或显示的对象数。对象的大小取决于命令。例如,如果对象大小为1字节,下面的示例是8字节的范围,从地址0x0001000开始。
0x00001000 L8
但是,如果对象大小是一个双字(32位或4字节),则以下两个范围分别给出一个8字节的范围。
0x00001000 0x00001007
0x00001000 L2
指定值还有两种其他方法(lsize范围说明符):
- L?大小(带问号)表示与l size相同,除了l?大小删除了调试器的自动范围限制。通常,范围限制为256 MB,因为较大的范围是印刷错误。如果要指定大于256 MB的范围,必须使用L?大小语法。
- L-size(带连字符)指定以给定地址结尾的长度大小范围。例如,8000000 L20指定从0x8000000到0x800001F的范围,8000000 L-20指定从0x7fffffffe0到0x7fffffffff的范围。
一些要求地址范围的命令接受一个地址作为参数。在这种情况下,命令使用一些默认的对象计数来计算范围的大小。通常,地址范围是最终参数的命令允许使用这种语法。
七、线程操作语法
许多调试器命令的参数都是线程标识符。波浪线(~)出现在线程标识符之前。
线程标识符可以是以下值之一:
线程标识符 | 描述 |
---|---|
~. |
当前线程。 |
~# |
导致当前异常或调试事件的线程。 |
~* |
此进程中的所有线程。 |
~数量 |
其索引的线程数。 |
~~[TID] |
其线程 ID 是在线程TID。 (括号是必需的和不能添加第二个波形符和左大括号之间有空格)。 |
~[表达式] |
线程的线程 ID 是到整数数值表达式解析。 |
在内核模式下控制线程
八、进程操作语法
许多调试器命令的参数都是进程标识符。一个竖条(|)出现在进程标识符之前。进程标识符可以是以下值之一。
进程标识符 | 描述 |
---|---|
|. |
当前进程。 |
|# |
引起当前异常或调试事件的进程。 |
|* |
所有进程。 |
|数量 |
进程的第几数。 |
|~[PID] |
进程的进程 ID PID。 (括号是必需的和不能添加颚化符 (~) 和左大括号之间有空格)。 |
|[Expression] |
其进程 ID 的整数进程数值表达式解析。 |
系统标识符 | 描述 |
---|---|
||. |
当前系统 |
||# |
导致当前异常或调试事件系统。 |
||* |
所有系统。 |
||ddd |
系统其序号ddd。 |
||1:1:017> ||
0 User mini dump: c:\notepad.dmp
. 1 User mini dump: c:\paint.dmp
# 2 User mini dump: c:\calc.dmp
注意,在一起调试活动目标和转储目标时会有一些复杂的情况,因为对于每种调试类型,命令的行为都不同。例如,如果在当前系统是转储文件时使用g(go)命令,则调试器将开始执行,但不能重新进入调试器,因为break命令不被识别为对转储文件调试有效。
0: kd>
使用~s(更改当前处理器)命令在处理器之间切换,如下例所示。
0: kd> ~1s
1: kd>
现在正在调试的计算机中的第二个处理器。
如果遇到中断而无法理解堆栈跟踪,则可能需要更改多处理器系统上的处理器。中断可能发生在其他处理器上。
||[Expression]
在这种语法中,方括号是必需的,表达式表示任何解析为与处理器ID对应的整数的数值表达式。在下面的示例中,处理器根据用户定义的伪寄存器的值进行更改。
||[@$t0]
示例
1: kd> 2k
下面的示例使用r(registers)命令显示处理器3的EAX寄存器。
1: kd> 3r eax
1: kd> 3r eax=808080
10.3、断点
在内核调试期间,bp、bu、bm(设置断点)和ba(访问中断)命令适用于多处理器计算机的所有处理器。例如,如果当前处理器是三个,则可以输入以下命令在someaddress处放置断点。
1: kd> bp SomeAddress
然后,在该地址执行的任何处理器(不仅是处理器一个)都会导致断点陷阱。
10.4、显示处理器信息
Windbg命令的语法规则系列(三)的更多相关文章
- Windbg命令的语法规则系列(二)
二.字符串通配符语法 一些调试器命令具有接受各种通配符的字符串参数.这些类型的参数支持以下语法功能: 星号(*)表示零个或多个字符. 问号(?)表示任何单个字符. 包含字符列表的括号([])表示列表中 ...
- Windbg命令的语法规则系列(一)
本文介绍使用调试器命令必须遵循的语法规则.使用Windbg调试时,应遵守以下一般语法规则: 您可以在命令和参数中使用大小写字母的任意组合,除非在本节的主题中特别指出. 可以用一个或多个空格或逗号(,) ...
- 常见bat(批处理)命令的语法规则
最近由于在做cocos2d的项目,需要用到一些bat命令,在此做些记录. bat命令用txt文本编辑就行,编辑完之后将后缀名改为bat即可运行.先来一个最简单的例子: @echo off echo \ ...
- Windbg命令脚本
命令脚本,就是将完成某个特定任务的相关命令组合在一起,保存在脚本文件里,加载到Windbg里执行,达到我们的目的.你可以理解为脚本就是一种语言,就像c或者汇编,但是他不需要编译器将其编译为可执行文件, ...
- WinDbg 命令三部曲:(三)WinDbg SOSEX 扩展命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- Python学习系列(四)Python 入门语法规则2
Python学习系列(四)Python 入门语法规则2 2017-4-3 09:18:04 编码和解码 Unicode.gbk,utf8之间的关系 2.对于py2.7, 如果utf8>gbk, ...
- docker常用命令、镜像命令、容器命令、数据卷,使用dockerFile创建镜像,dockefile的语法规则。
一.docker常用命令? 1. 常用帮助命令 1.1 docker的信息以及版本号 /* docker info 查看docker的信息 images2 docker本身就是一个镜像. docker ...
- Hexo系列(三) 常用命令详解
Hexo 框架可以帮助我们快速创建一个属于自己的博客网站,熟悉 Hexo 框架提供的命令有利于我们管理博客 1.hexo init hexo init 命令用于初始化本地文件夹为网站的根目录 $ he ...
- iptables系列教程(二)| iptables语法规则
一个执着于技术的公众号 iptables 命令基本语法 " iptables [-t table] command [链名] [条件匹配] [-j 目标动作] 以下是对 iptables 命 ...
随机推荐
- Ubuntu 编译安装 nginx
有关博客: <Windows 编译安装 nginx 服务器 + rtmp 模块>.<Ubuntu 编译安装 nginx>.<Arm-Linux 移植 Nginx> ...
- 全栈项目|小书架|服务器端-NodeJS+Koa2 实现书籍详情接口
通过上篇文章 全栈项目|小书架|微信小程序-首页水平轮播实现 我们实现了前端(小程序)效果图的展示,这篇文章来介绍服务器端的实现. 书籍详情分析 书籍详情页面如下: 从上图可以分析出详情页面大概有以下 ...
- redis - redis安装与启动
redis安装 下载redis安装包 wget http://download.redis.io/releases/redis-5.0.7.tar.gz 解压缩 tar -xzf redis-5.0. ...
- Java中守护线程的总结
在Java中有两类线程:User Thread(用户线程).Daemon Thread(守护线程) 用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆: 只要当前JVM实例中尚存 ...
- 4、线程池(摘自C#高级编程第7版)
1.需求背景 创建线程需要时间.如果有不同的小任务完成,就可以事先创建许多线程,在应完成这些任务时发出请求.这个线程数最好在需要更多的线程时增加,在需要释放资源时减少. 2.线程池出场 不需要自己 ...
- 两个div并排显示,当浏览器界面缩小时会出现换行
解决:规定两个子div的父div的宽 <div id="showDataDiv" style="width: 1000px"> <div st ...
- K-匿名算法研究
12月的最后几天,研究了下k匿名算法,在这里总结下. 提出背景 Internet 技术.大容量存储技术的迅猛发 展以及数据共享范围的逐步扩大,数据的自动采集 和发布越来越频繁,信息共享较以前来得更为容 ...
- 【转载】C#使用ToList()将数组快速转换为List集合
在C#的编程中,数组和List集合是比较常用的两个集合类,有时候因为业务需要,需要将数组集合转换为List集合,此时就可以使用C#中的Linq的扩展方法ToList方法来实现,只需要简单的一条语句即可 ...
- JavaWeb 之 MVC 开发模式
MVC 开发模式 一.JSP 演变历史 1. 早期只有servlet,只能使用response输出标签数据,非常麻烦 2. 后来又jsp,简化了Servlet的开发,如果过度使用jsp,在jsp中即写 ...
- linux查看log软件
可以使用LNAV软件查看log,还是比较方便的 安装步骤 $ sudo apt install lnav 获取帮助信息 $ lnav -h 查看日志 $ lnav 查看指定日志(后面加上绝对路径) $ ...