利用伪寄存器对MSVC++进行调试的介绍
简介
让我们从我写这篇文章的原因开始。一天,一个同事让我帮他调试他遇到的问题。所以我看着他在输入代码,这时我注意到下面一行:
int test = GetLastError();
他这样做是因为他想知道错误代码,如果之前的函数失败了。他每次想知道错误代码就加上这一行。我建议他删除所有这些行并在他的监视窗口中使用@ERR伪寄存器。他不知道这是什么,在办公室里到处打听,很多人都不知道,所以我为从来没有听说过伪寄存器的人写了这篇文章。
什么是伪寄存器?
伪寄存器不是当前的硬件寄存器,而是像硬件寄存器一样显示。使用伪寄存器,您可以在调试器中看到并使用某些值(错误代码、线程信息块…)。让我们看看@ERR伪寄存器。用您最喜欢的应用程序启动调试器。在代码中放置断点,以便调试器中断执行。打开“监视”窗口(如果尚未打开)(右键单击某个空工具栏空间,然后从该列表中选择“监视”来执行此操作)。在这个监视窗口中添加@ERR。您应该在值列中看到0。现在检查一下你的代码,看看这个值。它将始终显示当前线程的GetLastError()数字。所以如果你的代码出错了,这个值就会改变。
如果你想测试这个,但是你的代码没有任何错误,我建议你放一些进去(但是不要忘记以后删除它们)。您可以插入如下内容:
FILE *fp = fopen("c:\\a_file_that_does_not_exist.txt", "r");
如果执行这一行,就会看到@ERR值变为2。转到“工具”->“错误查找”查看此错误值的含义(“如果您想知道,系统找不到指定的文件”)。像我这样懒散的流浪汉,还有像你这样聪明的小伙子/姑娘,可以把@ERR伪寄存器改成@ERR,hr。这样做会将伪寄存器的值更改为错误字符串。现在您甚至不必查找错误。我一直把“@ERR,hr”放在观察窗里。
条件表达式
伪寄存器也可用于条件表达式。要尝试此操作,请在fopen后面加上以下行:
if (fp)
{
fclose(fp);
}
只是为了好奇(或者与本文完全无关):ERR做什么?它如何得到错误号?事实证明,@ERR所做的与GetLastError()所做的完全相同。这些函数有多达3行的汇编代码:
mov eax,fs:[00000018h]
mov eax,dword ptr [eax+34h]
ret
因此,@ERR在fs:[18h]指向的线程环境块中获取偏移量0x34处的DWORD。
@TIB伪寄存器
@ERR伪寄存器不是唯一存在的寄存器。另一个重要的伪寄存器是@TIB。这是当前线程的线程信息块,在多线程调试中非常有用。如果在由多个线程调用的函数中放置断点,则无论哪个线程通过断点,调试器都将每次中断执行。即使正在单步执行代码,如果另一个线程调用该函数,调试器也可以跳到断点。要解决这个问题,您需要执行以下操作。如果要执行的线程中断,请在监视窗口中添加@TIB。您将在常规显示中看到一些值,如“0x7ffa6000”或“2147115008”。转到断点菜单(Alt-F9)并选择断点。现在可以添加@TIB==0x7ffa6000条件筛选器。这样做,调试器只会中断此线程的执行。使用同一函数的所有其他线程都不会导致中断。
但这在Windows98中不起作用。对于Windows98,您需要查看Intel CPU FS寄存器,它对每个线程都是唯一的。您可以使用表达式@FS==value。
伪寄存器的完整列表
Pseudoregister | Description |
@ERR |
Last error value; the same value returned by the GetLastError() API function |
@TIB |
Thread information block for the current thread; necessary because the debugger doesn't handle the "FS:0" format |
@CLK |
Undocumented clock register; usable only in the Watch window |
@EAX , @EBX , @ECX , @EDX , @ESI , @EDI , @EIP , @ESP , @EBP , @EFL |
Intel CPU registers |
@CS , @DS , @ES , @SS , @FS , @GS |
Intel CPU segment registers |
@ST0 , @ST1 , @ST2 , @ST3 , @ST4 , @ST5 , @ST6 , @ST7 |
Intel CPU floating-point registers |
利用伪寄存器对MSVC++进行调试的介绍的更多相关文章
- 从知乎首页用户操作入口学习到的CSS技巧 - 合理利用伪元素实现一些装饰样式
最近在模仿做一个静态的PC版知乎,在模仿的过程中,从知乎工程师的方法中学到了不少知识,比如CSS方面的,以下介绍一个今天学到的伪元素的技巧. 示例 DOM结构为: <div class=&quo ...
- 简单的纯css重置input单选多选按钮的样式--利用伪类
由于input单选多选的原生样式通常都不符合需求,所以在实现功能时通常都需要美化按钮 html <input type="radio" /> <input typ ...
- 通过win下的eclipse连接虚拟机中伪分布的hadoop进行调试
VMware虚拟机配置Ubuntu桥接方式(Bridged)使虚拟机和宿主机能互相ping通, 通过win下的eclipse连接虚拟机中伪分布的hadoop进行调试 1.设置Bridged上网方式 V ...
- 风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击
风炫安全web安全学习第三十三节课 文件包含漏洞基础以及利用伪协议进行攻击 文件包含漏洞 参考文章:https://chybeta.github.io/2017/10/08/php文件包含漏洞/ 分类 ...
- 利用Jemalloc进行内存泄漏的调试
内存不符预期的不断上涨,可能的原因是内存泄漏,例如new出来的对象未进行delete就重新进行复制,使得之前分配的内存块被悬空,应用程序没办法访问到那部分内存,并且也没有办法释放:在C++中,STL容 ...
- Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法:
Qt中利用QTime类来控制时间,这里简单介绍一下QTime的成员函数的用法: ------------------------------------------------------------ ...
- 利用Python进行数据分析——重要的Python库介绍
利用Python进行数据分析--重要的Python库介绍 一.NumPy 用于数组执行元素级计算及直接对数组执行数学运算 线性代数运算.傅里叶运算.随机数的生成 用于C/C++等代码的集成 二.pan ...
- 利用伪元素和css3实现鼠标移入下划线向两边展开效果
一.思路: 将伪元素:before和:after定位到元素底部中间,设置宽度从0变成100%达到目的. 二.实现: 1.首先定义一个块状元素(行内元素没有宽高)并修改样式为一个背景色为浅灰色的矩形,设 ...
- mac下利用Breakpad的dump文件进行调试
一.前情回顾 最近把公司的一个视频处理程序更新了一个版本,准备提交测试的发现了崩溃的情况.这个程序采用Qt和ffmpeg技术栈开发,主要用于对视频进行渲染拼接处理,在Windows和mac两个平台同时 ...
随机推荐
- Scala 数组操作之Array、ArrayBuffer以及遍历数组
ArrayBuffer 在Scala中,如果需要类似于Java中的ArrayList这种长度可变的集合类,则可以使用ArrayBuffer. // 如果不想每次都使用全限定名,则可以预先导入Array ...
- Xgboost GPU配置
眼残cmake版本配错了搞了半天,简单记录一下,老规矩,参考一下官方的文档. git clone --recursive https://github.com/dmlc/xgboost cd xgbo ...
- Redis常用配置和命令总结
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言 ...
- MySQL--用户管理 pymysql 索引
目录 用户管理 创建mysql账户 权限管理 涉及到的表 pymysql 索引 语法 结论 用户管理 主要是为了控制权限,让不同的人只能操作只属于只记得那部分数据 创建mysql账户 账户中涉及三个数 ...
- 分布式事务:Saga模式
1 Saga相关概念 1987年普林斯顿大学的Hector Garcia-Molina和Kenneth Salem发表了一篇Paper Sagas,讲述的是如何处理long lived transac ...
- 17、在vue中引用移动端框架Vux:
1:使用vue-cli创建好项目(此处省略步骤)2:在项目中安装vux:npm install vux --save3:安装vux-loader:npm install vux-loader --s ...
- Number最大范围相关
今天在leetcode上面做题目,有一道数组形式的整数加法运算,本来以为还蛮简单的,想着直接将数组先转化为String类型,然后直接相加就好, 代码如下: var addToArrayForm = f ...
- Java JDBC结果集的处理
结果集指针的移动 while (resultSet.next()){ //...... } 指针最初指向第一条记录之前,next()是指向下一个位置,返回的是boolean值,true表示有内容(记录 ...
- php日期格式化方法详解
php日期格式化一般使用date()来完成,此函数的声明及定义如下图所示,其参数有很多,这里按常用的年.月.日.时.分.秒.星期来简单介绍. date(format,timestamp) 一.年.月. ...
- HBase的部署与其它相关组件(Hive和Phoenix)的集成
HBase的部署与其它相关组件(Hive和Phoenix)的集成 一.HBase部署 1.1.Zookeeper正常部署 首先保证Zookeeper集群的正常部署,并启动之: /opt/module/ ...