-
-
高级语言实现条件断点妙法[原创]
-
2006-7-13 16:30
5421
-
现在很多高级语言得编译器(说是IDE也可以)都提供条件断点功能(尤其是一些pascal编译器),调试程序的时候,(例如在大循环中for i= 1 to 10000,只要调试i==2000的那次循环;又如处理WinProc时候只想跟踪调试某个消息)条件断点能够加快调试,该暂停的时候暂停不该暂停的时候不暂停。
然而面对大部分常用的编译器,条件断点并不是编译器自带的。那么难道就没有办法实现条断了?
若是这样,那么些这篇帖子就没必要了。
那么如何实现呢?
=================================================
第一次尝试
-------------------------------------------------
有经验的程序员一定会想到利用3号中断。这是个好办法。
拿C语言做示范:
.......
for(i=1;i<=10000;i++){
......
if(i==2000)int86(3,NULL,NULL); /*当i==2000时候自动会停下*/
......
}....
....
但是,这种方法多适用于dos程序,对于windows GUI 以及 windows console 要另做打算。也就是说同样的程序在TC、DJGPP中顺利实现,而在DEV-C++、VC++里甚至连编译都通不过(至少需要进行修改)。
--------------------------------------------------
==================================================
第二次尝试
--------------------------------------------------
稍加思考,又得出一类做法。
下面的方法巧妙地利用了高级语言的特征设置条件断点,大家一看就会明白。
unsigned char flag;
.......
for(i=1;i<=10000;i++){
......
if(i==2000) /* 产生断点的条件 */
flag=1; /* 如图,在IDE中给仅这行设置断点,这一步只是摆个样子,以便设置常规的断点。 */
/* 在写这行的时候小心被编译器“自作聪明”的“优化”给吞了 */
......
}....
....
附图:
怎么样,十分明白了吧。
=============================
这些东西并不曾在什么程序设计的书上看到过。于是将经验写下,共分享。
[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。