MSVC的调试技巧: Pseudoregisters

原创 2002年10月08日 09:22:00

MSVC的调试技巧: Pseudoregisters<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

- 翻译自CodeProject.com

让我们从为什么写这篇文章开始. 一天, 一个学生让我帮助他解决一个调试问题. 为此我看着他单步进入代码, 当我看到如下代码:

int test = GetLastError();

他这样做事为了知道之前函数失败的错误代码. 每次他需要知道错误代码的时候都添加上面的代码行. 我建议他删除所有的代码行代之以调试”Watch”窗口当中添加”@ERR”. 他不知道这是什么, 在场的其他人也不知道这是什么技术. 所以我写下这篇文章给那些从未听说过”pseudoregisters”技术的人.

什么是”pseudoregister”技术?

“pseudoregister”并不是一个真正的硬件寄存器. 利用pseudoregister可以查看并且使用调试器当中的特定值(错误代码, 线程信息块, …).

让我们看看@ERR. 启动一个调试应用程序. 在你的代码放置断点便于调试器中断执行. 打开Watch窗口, 添加@ERR到窗口. 你可以在值列看到值为零. 现在可以调试你的代码并且查看数值. @ERR总是显示当前线程的GetLastError()数值. 当执行发生错误的时候, 数值就会改变了.

要测试, 写下如下导致错误的代码:

FILE *fp = fopen("c://a_file_that_does_not_exist.txt", "r");

步入上述代码行的时候, @ERR数值修改成为2. 利用Tools->Error Lookup 可以查看对应的错误代码解释为 ("The system cannot find the file specified"). 如果添加”,hr”, 错误信息就会显示出来, 不用”Error Lookup”工具了(译者: 一般”err, hr”也是一样的)

条件表达式

Pseudoregisters也可以被使用在条件表达式当中, 添加如下代码行到fopen:

if (fp)

{

      fclose(fp);

}

"if (fp)"添加断点. 利用Edit->Breakpoints (Alt-F9)添加条件@ERR==2”. 启动调试以后, fopen() 文件不存在的时候进入断点. 如果文件存在断点不会触发, 即使在触发其他错误的时候也是如此(例如4: 无法打开指定文件).

@TIB pseudoregister

@ERR不是唯一的调试寄存器. 另一个重要的寄存器是@TIB. 这是当前线程的信息并且对于多线程调试非常有用. 如果你在多线程调用的函数当中添加断点, 调试器在不管什么线程调用的时候总是触发断点. 即使你步出代码也会进入另一个线程调用(断点). 要解决这个问题, 你需要进行以下错误. 如果要触发指定线程的断点, 添加@TIB寄存器. 你会看到诸如"0x7ffa6000"或者"2147115008"的寄存器值. 编辑断点条件, 设置条件@TIB==0x7ffa6000. 这样, 调试器仅仅会在指定线程触发. 其他调用同一个函数的线程不会触发.

不过这对于Win98不适用. 对于Windows 98, 需要利用Intel CPU的寄存器@FS==value

完整的寄存器列表:

Pseudoregister

Description

@ERR

最后错误值; GetLastError() API 函数一致

@TIB

当前线程信息; 在调试器无法处理”FS:0”格式的时候是必要的

@CLK

未列入文档的寄存器; 只是在Watch窗口适用

@EAX, @EBX, @ECX, @EDX, @ESI, @EDI, @EIP, @ESP, @EBP, @EFL

Intel CPU 寄存器

@CS, @DS, @ES, @SS, @FS, @GS

Intel CPU 段寄存器

@ST0, @ST1, @ST2, @ST3, @ST4, @ST5, @ST6, @ST7

Intel CPU 浮点寄存器

 

[zt]MSVC的调试技巧: Pseudoregisters

MSVC的调试技巧: Pseudoregisters- 翻译自CodeProject.com让我们从为什么写这篇文章开始. 一天, 一个学生让我帮助他解决一个调试问题. 为此我看着他单步进入代码, 当...
  • yjm0105
  • yjm0105
  • 2009年07月03日 09:55
  • 141

[debug]MSVC的调试技巧: Pseudoregisters

“pseudoregister”并不是一个真正的硬件寄存器. 利用pseudoregister可以查看并且使用调试器当中的特定值(错误代码, 线程信息块, …). 让我们看看@ERR. 启动一个调试应...
  • chinacodec
  • chinacodec
  • 2009年01月26日 22:20
  • 832

[调试技巧3]MSVC的调试技巧: Pseudoregisters

rick1126C、C++ (2002-10-01 18:52:20) MSVC的调试技巧: Pseudoregisters- 翻译自CodeProject.com让我们从为什么写这篇文章开始. 一天...
  • jiangredsheep
  • jiangredsheep
  • 2005年06月30日 20:36
  • 915

QT 的基础调试技巧 -- 未完 -- 更新中

1 QT creator 里面 1.1 加打印的方法 qDebug()"---hsy--test--showtable---"; 这条加了之后,程序走到这里,就会在应用程序输出那里打印出...
  • yellow_hill
  • yellow_hill
  • 2017年06月22日 11:48
  • 266

Chrome调试技巧

谷歌浏览器如今是Web开发者们所使用的最流行的网页浏览器。伴随每六个星期一次的发布周期和不断扩大的强大的开发功能,Chrome变成了一个必须掌握的工具。大多数前端开发者可能熟悉关于chorme的许多特...
  • shenlei19911210
  • shenlei19911210
  • 2016年03月27日 15:54
  • 4497

Qt msvc版安装使用部署发布

最近在做一些 Qt 的东西,以前没有玩过,菜鸟一枚。         开始是在 Ubuntu 用的 Qt 5.5.1, IDE 是 Creator。不用写 Makefile 这些东东,感觉还可以,呵呵...
  • QQ575302235
  • QQ575302235
  • 2016年06月07日 12:47
  • 2190

Eclipse 10个最有用的java调试技巧

开发程序少不了出错、调试,Eclipse应该是最常用的java ide了,那么Eclipse有哪些技巧可以提高我们调试的效率呢?本文翻译自《Top 10 Java Debugging Tips wit...
  • u011004037
  • u011004037
  • 2015年04月09日 20:02
  • 2897

Linux下常用调试技巧

(一) 有漏洞的程序(二) 代码检查(三) 取样法 (四) 使用gdb进行调试
  • delphiwcdj
  • delphiwcdj
  • 2011年07月13日 20:22
  • 3167

Android Studio代码调试技巧篇

ndroid Studio目前已经成为开发Android的主要工具,用熟了可谓相当顺手。作为开发者,调试并发现bug,进而解决,可是我们的看家本领。正所谓,工欲善其事必先利其器,和其他开发工具一样,如...
  • H291850336
  • H291850336
  • 2016年06月02日 11:31
  • 4473

VS2010中的调试技巧总结

VS2010中的调试技巧     跳到当前光标处(Ctrl+F10)   我经常看到人们为了到达目标代码位置,而在程序中早早设定了断点,然后反复地按F10/F11,一步步走到目标代码处。当程序员的确...
  • hehe6378
  • hehe6378
  • 2014年01月22日 13:37
  • 1034
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MSVC的调试技巧: Pseudoregisters
举报原因:
原因补充:

(最多只允许输入30个字)