Windbg命令的语法规则系列(二)
二、字符串通配符语法
一些调试器命令具有接受各种通配符的字符串参数。这些类型的参数支持以下语法功能:
- 星号(*)表示零个或多个字符。
- 问号(?)表示任何单个字符。
- 包含字符列表的括号([])表示列表中的任何单个字符。列表中只有一个字符匹配。在这些括号中,可以使用连字符(-)指定范围。例如,prog[er-t7]am匹配“progeam”、“program”、“progsam”、“progtam”和“prog7am”。
- 数字符号(#)表示前面零个或多个字符。例如,lo#p与“lp”、“lop”、“loop”、“loop”等匹配。您还可以将数字符号与括号组合,因此m[ia]#n与“mn”、“min”、“man”、“maan”、“main”、“mian”、“miin”、“miain”等匹配。
- 加号(+)表示前面的一个或多个字符。例如,lo+p与lo p相同,只是lo+p与“lp”不匹配。同样,m[ia]+n与m[ia]n相同,只是m[ia]+n与“mn”不匹配。A?+B和A*B一样,除了A?+B与“AB”不匹配。
- 如果必须指定文字数字符号(#),问号(?),左括号([),右括号(]),星号(*)或加号(+)字符,必须在字符前面添加反斜杠(\)。如果不将连字符括在括号中,则连字符始终是文字。但不能在带括号的列表中指定文字连字符。
:> r eax = @ebx
基于x86的处理器上的标志
基于x86的处理器也使用多个1位寄存器,称为标志。
寄存器和线程
四、伪寄存器语法
调试器支持保存某些值的多个伪寄存器。调试器将自动伪寄存器设置为某些有用的值。用户定义的伪寄存器是可写入或读取的整数变量。所有伪寄存器都以美元符号($)开头。如果使用MASM语法,可以在美元符号之前添加at符号(@)。这个at符号告诉调试器以下标记是寄存器或伪寄存器,而不是符号。如果省略了at符号,调试程序的响应会更慢,因为它必须搜索整个符号表。
例如,以下两个命令产生相同的输出,但第二个命令更快。
:> ? $exp
Evaluate expression: = 0000008f
:> ? @$exp
Evaluate expression: = 0000008f
如果存在与伪寄存器同名的符号,则必须添加at符号@。如果使用C++表达式语法,则总是需要at符号(@)。
r(registers)命令是此规则的一个例外。调试器总是将其第一个参数解释为寄存器或伪寄存器。(不需要或不允许使用at符号@。)如果r命令有第二个参数,则根据默认表达式语法进行解释。如果默认表达式语法是C++,则必须使用以下命令将$T2伪寄存器复制到$T1伪寄存器。
:> r $t1 = @$t2
4.1、自动伪寄存器
调试器自动设置以下伪寄存器:
| 伪寄存器 | 描述 |
|---|---|
|
$ea |
已执行的最后一个指令的有效地址。 如果此指令没有有效的地址,调试器将显示"错误的寄存器错误"。 如果此指令有两个有效的地址,调试器会显示第一个地址。 |
|
$ea2 |
已执行的最后一个指令的第二个的有效地址。 如果此指令不具有两个有效的地址,调试器将显示"错误的寄存器错误"。 |
|
$exp |
最后一个表达式的计算。 |
|
$ra |
寄信人地址为当前位于堆栈上。 此地址是在执行命令中尤其有用。 例如, g @$ ra继续,直到找到的寄信人地址 (尽管(Go Up) gu是"单步执行"当前函数的更精确地有效的方法)。 |
|
$ip |
指令指针寄存器。 基于 x86 的处理器:与相同eip。 基于 Itanium 处理器:与相关iip。 (有关详细信息,请参阅此表后面的说明)。基于 x64 的处理器:与相同rip。 |
|
$eventip |
当前事件的时间处的指令指针。 此指针通常与匹配$ip,除非你切换线程或手动更改指令指针的值。 |
|
$previp |
上一事件的时间处的指令指针。 (中断到调试器计为一个事件。) |
|
$relip |
指令指针与当前事件相关的。 分支跟踪时,此指针是指向分支源的指针。 |
|
$scopeip |
当前指令指针本地上下文(也称为作用域)。 |
|
$exentry |
当前进程的第一个可执行文件的入口点的地址。 |
|
$retreg |
主要的返回值寄存器中。 基于 x86 的处理器:与相同eax。 基于 Itanium 处理器:与相同ret0。 基于 x64 的处理器:与相同rax。 |
|
$retreg64 |
在 64 位格式中注册主要的返回值。 x86 处理器:与相同edx: eax对。 |
|
$csp |
当前调用堆栈指针。 此指针是最具代表性的调用堆栈深度的寄存器。 基于 x86 的处理器:与相同esp。基于 Itanium 处理器:与相同bsp。 基于 x64 的处理器:与相同rsp。 |
|
$p |
值的最后一个d \* (显示内存)打印命令。 |
|
$proc |
当前进程 (即,地址 EPROCESS 块) 的地址。 |
|
$thread |
当前线程的地址。 在内核模式调试,此地址是 ETHREAD 块的地址。 在用户模式调试,此地址为线程环境块 (TEB) 的地址。 |
|
$peb |
当前进程的进程环境块 (PEB) 的地址。 |
|
$teb |
当前线程的线程环境块 (TEB) 的地址。 |
|
$tpid |
拥有当前线程的进程的进程 ID (PID)。 |
|
$tid |
当前线程的线程 ID。 |
|
$dtid |
|
|
$dpid |
|
|
$dsid |
|
|
$bpNumber |
相应的断点的地址。 例如,美元 bp3 (或美元 bp03) 指的是断点的断点 ID 为 3。 数字始终是一个十进制数。 如果任何断点不的 ID 为数量, $bp数计算结果为零。 有关断点的详细信息,请参阅使用断点。 |
|
$frame |
当前的帧索引。 此索引是相同的帧号.frame (设置本地上下文)命令使用。 |
|
$dbgtime |
根据计算机上运行调试器的当前时间。 |
|
$callret |
返回值的最后一个函数.call (调用函数)中使用或调用.fnret /s命令。 数据类型$callret是此返回值的数据类型。 |
|
$extret |
|
|
$extin |
|
|
$clrex |
|
|
$lastclrex |
托管仅调试:上一次遇到公共语言运行时 (CLR) 异常对象的地址。 |
|
$ptrsize |
指针的大小。 在内核模式下,此大小是目标计算机上的指针大小。 |
|
$pagesize |
在一页上的内存字节数。 在内核模式下,此大小为目标计算机上的页面大小。 |
|
$pcr |
|
|
$pcrb |
|
|
$argreg |
|
|
$exr_chance |
当前的异常记录的可能性。 |
|
$exr_code |
当前的异常记录异常代码。 |
|
$exr_numparams |
当前的异常记录中的参数数量。 |
|
$exr_param0 |
当前的异常记录中的参数 0 的值。 |
|
$exr_param1 |
当前的异常记录中的值的参数 1。 |
|
$exr_param2 |
当前的异常记录中的参数 2 的值。 |
|
$exr_param3 |
当前的异常记录中的参数 3 的值。 |
|
$exr_param4 |
当前的异常记录中的参数 4 的值。 |
|
$exr_param5 |
当前的异常记录中的参数 5 的值。 |
|
$exr_param6 |
当前的异常记录中的参数 6 的值。 |
|
$exr_param7 |
当前的异常记录中的值的参数 7。 |
|
$exr_param8 |
当前的异常记录中的参数 8 的值。 |
|
$exr_param9 |
当前的异常记录中的值的参数 9。 |
|
$exr_param10 |
当前的异常记录中的参数 10 的值。 |
|
$exr_param11 |
当前的异常记录中的参数 11 的值。 |
|
$exr_param12 |
当前的异常记录中的值的参数 12。 |
|
$exr_param13 |
当前的异常记录中的值的参数 13。 |
|
$exr_param14 |
当前的异常记录中的值为 14 个参数。 |
|
$bug_code |
如果发生了错误检查,这是错误代码。 适用于实时内核模式调试和内核故障转储。 |
|
$bug_param1 |
如果发生了错误检查,这是参数 1 的值。 适用于实时内核模式调试和内核故障转储。 |
|
$bug_param2 |
如果发生了错误检查,这是参数 2 的值。 适用于实时内核模式调试和内核故障转储。 |
|
$bug_param3 |
如果发生了错误检查,这是参数 3 的值。 适用于实时内核模式调试和内核故障转储。 |
|
$bug_param4 |
如果发生了错误检查,这是参数 4 的值。 适用于实时内核模式调试和内核故障转储。 |
一个包含结构的地址的伪寄存器(比如$线程)、$、$、$和$将根据C++表达式计算器中的适当数据类型进行评估,但不是在表达式求值器中。例如,命令?$teb显示teb的地址,而命令??@$teb显示整个teb结构。有关详细信息,请参见计算表达式。在基于Itanium的处理器上,IIP寄存器是捆绑对齐的,这意味着它指向包含当前指令的捆绑中的插槽0,即使正在执行不同的插槽。所以IIP不是完整的指令指针。$IP伪寄存器是实际的指令指针,包括bundle和slot。其他持有地址指针的伪寄存器($ra、$retreg、$eventip、$previp、$relip和$exentry)的结构与所有处理器上的$ip相同。
您可以使用r命令更改$ip的值。此更改也会自动更改相应的寄存器。当执行恢复时,它将恢复到新的指令指针地址。这个寄存器是唯一可以手动更改的自动伪寄存器。注意:在masm语法中,可以用句点(.)表示$ip伪寄存器。。在此期间之前不添加at符号(@),也不将该期间用作r命令的第一个参数。在C++表达式中不允许使用此语法。自动伪寄存器类似于自动别名。但是,可以将自动别名与别名相关的令牌(如$)一起使用,并且不能将伪寄存器与此类令牌一起使用
4.2、用户定义的伪寄存器
:> r $t0 =
:> r $t1 = *poi(MyVar)
:> bp $t3
:> bp @$t4
:> ?? @$t1 + *@$t2
除非使用?与R命令一起切换。如果使用此开关,伪寄存器将获取分配给它的任何类型。例如,下面的命令将unicode_string**类型和0x0012ffbc值分配给$t15。
:> r? $t15 = * (UNICODE_STRING*) 0x12ffbc
kd> bp /t @$thread nt!ntopenfile
下面的示例执行一个命令,直到寄存器保留指定的值。首先,在名为“eaxstep”的脚本文件中放入以下条件步进代码。
.if (@eax == ) { .echo } .else { t "$<eaxstep" }
接下来,发出以下命令。
t "$<eaxstep"
调试器执行一个步骤,然后运行您的命令。在这种情况下,调试器运行脚本,该脚本显示1234或重复该过程。
Windbg命令的语法规则系列(二)的更多相关文章
- Windbg命令的语法规则系列(一)
本文介绍使用调试器命令必须遵循的语法规则.使用Windbg调试时,应遵守以下一般语法规则: 您可以在命令和参数中使用大小写字母的任意组合,除非在本节的主题中特别指出. 可以用一个或多个空格或逗号(,) ...
- Windbg命令的语法规则系列(三)
五.源文件行语法 可以将源文件行号指定为MASM表达式的全部或部分.这些数字计算出与该源代码行对应的可执行代码的偏移量.不能使用源代码行作为C++表达式的一部分.必须用重音符(`)将源文件和行号表达式 ...
- 常见bat(批处理)命令的语法规则
最近由于在做cocos2d的项目,需要用到一些bat命令,在此做些记录. bat命令用txt文本编辑就行,编辑完之后将后缀名改为bat即可运行.先来一个最简单的例子: @echo off echo \ ...
- Windbg命令脚本
命令脚本,就是将完成某个特定任务的相关命令组合在一起,保存在脚本文件里,加载到Windbg里执行,达到我们的目的.你可以理解为脚本就是一种语言,就像c或者汇编,但是他不需要编译器将其编译为可执行文件, ...
- iptables系列教程(二)| iptables语法规则
一个执着于技术的公众号 iptables 命令基本语法 " iptables [-t table] command [链名] [条件匹配] [-j 目标动作] 以下是对 iptables 命 ...
- WinDbg 命令三部曲:(二)WinDbg SOS 扩展命令手册
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 系列博文 <WinDbg 命令三部曲:(一)WinDbg 命令手册> <WinDb ...
- 【 MAKEFILE 编程基础之二】MAKEFILE 书写规划以及语法规则!
本站文章均为 李华明Himi 原创,转载务必在明显处注明: 转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/gcc-makefile/768.html ...
- 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 ...
随机推荐
- [终极巨坑]golang+vue开发日记【二】,登陆界面制作(一)
写在前面 本期内容是适合第一次使用vue或者golang开发的,内容会以实战的形式来讲解.看懂本段内容需要了解基础内容有html,css,最好可以看一下vue的基础.并且这里的每个知识点不可能详细解说 ...
- ODBC数据导入
这个方法其实是导入excel 首先进入pl/sql dev (1):tools-->ODBC importer (2):点击connect,选择需要导入的excel (3):如果事先数据库中没有 ...
- JDK8源码解析 --- Long 类型
最近都在看JDK8的源码,想把记录下来与大家一起共享,每天 积累一点,每天成长一点.看了装箱Long类型,有好多以前没有注意到或者不知道的内容,慢慢懂得.废话不多说,直接上代码讲解... 1.缓存区L ...
- MSP---助力企业轻松上云
一.企业上云的总体步骤 1.传统企业级应用上云方法论概述 2.应用现代化概念 3.应用上云都需要什么 1.评估该应用是否可以上云, 2.上云需要付出多少时间和人力 3.企业级应用案例 4.生成评估报告 ...
- Java知识回顾 (18)Java 8、9、11的新特性
Java 8 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 Jav ...
- Java知识回顾 (13)序列化
本资料来自于runoob,略有修改. 整个过程都是 Java 虚拟机(JVM)独立的,也就是说,在一个平台上序列化的对象可以在另一个完全不同的平台上反序列化该对象. 类 ObjectInputStre ...
- js中console.info的使用
语法:console.info(obj1 [, obj2, ..., objN]);console.info(msg [, subst1, ..., substN]); 参数obj1 ... objN ...
- Celery:Next Steps
参考文档:http://docs.celeryproject.org/en/latest/getting-started/next-steps.html#next-steps
- 笔谈kxmovie开源播放器库的使用
开源播放器项目 kxmovie(https://github.com/kolyvan/kxmovie),现在仍然是很多刚开始接触播放器开发的程序员的参照范本.以下是我操作kxmovie项目的过程: ( ...
- 软工作业 wc-java
项目要求: 实现一个统计程序,它能正确统计程序文件中的字符数.单词数.行数,以及还具备其他扩展功能,并能够快速地处理多个文件. 具体功能 -c 返回文件字符数 -w 返回词的数目 -l 返回行数 扩展 ...