分享
 
 
 

MSVC的调试技巧: Pseudoregisters

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

MSVC的调试技巧: Pseudoregisters

- 翻译自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 浮点寄存器

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有