首页
社区
课程
招聘
高级语言实现条件断点妙法[原创]
2006-7-13 16:30 5421

高级语言实现条件断点妙法[原创]

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漏洞挖掘与利用;代码审计。

收藏
点赞0
打赏
分享
最新回复 (9)
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
prince 16 2006-7-13 17:24
2
0
__asm int 3
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 6 2006-7-13 17:28
3
0
__asm 用不来,每次用了连编译都通不过
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2006-7-13 17:41
4
0
最初由 prince 发布
__asm int 3


我也用这个的,尤其在多线程的时候更有用
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2006-7-13 18:00
5
0
__asm int3
__asm __emit 0xCC
都可以
甚至有一个API叫DebugBreak,直接就是插CC
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 6 2006-7-14 07:10
6
0
哦?

不过我用条断的主要目的是调试acm的算法题,那样要求在许多编译器中都可以通用

asm 关键字在每个编译器中用法基本上都不一样(一般DJGPP,TC2,DEVCPP,gcc 这4个编译器在写acm的时候互相交叉使用,其中插入汇编的规范各有不同),甚至TC2还不支持 asm 关键字。于是寻找一种通用的方法。
--------------------------------------
希望这个帖子能有抛砖引玉的效果
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huoshan 2006-7-14 07:47
7
0
asset(i==2000) ?
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 6 2006-7-15 10:57
8
0
哦? asset这个方法比较有意思
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
快雪时晴 4 2006-8-1 23:02
9
0
em,方法很实用,这么好的东西竟沉了
雪    币: 249
活跃值: (10)
能力值: ( LV12,RANK:250 )
在线值:
发帖
回帖
粉丝
wiaa 6 2006-8-4 14:45
10
0
快雪时晴帖,这个名字真好
游客
登录 | 注册 方可回帖
返回