游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1038|回复: 0

vc调试 wxh zt

[复制链接]

1367

主题

1993

帖子

2118

积分

金牌会员

Rank: 6Rank: 6

积分
2118
发表于 2006-8-29 16:01:00 | 显示全部楼层 |阅读模式

原作者姓名 林建华

介绍
其实vc调试很想破案,破案当然需要经验,不过破案也有一些套路,按照这些套路来,一般的小案子还是能够破解的。这里我主要以一件程序意外死亡的案件为例,来讲一些基本的调试套路。

正文
在一个月黑风高的夜晚,我们尊敬的A程序莫名其妙的死掉了,报案的是我们的线人ASSERT。

1.我们对弹出的对话框按重试,然后按取消,第一时间来到了ASSERT所说的案发现场,原来是中毒死亡--一个本来不应该为空的句柄现在变成空的了。

2.那么为什么会变成空呢?我们需要找到第一现场,也就是下毒的地方。警察立即排查所有可疑人物,把所有对这个句柄进行过操作的地方进行观察,结果所有证人的口供都非常的一致,我们无法从表面的现象看出到底是在哪里出了问题。

3.怎么办呢?这样的话我们只好对整个案件进行推演(现在有个高级点的名称叫做案件再现)。1998年7月1日早饭,吃后正常,午饭正常,晚饭,7月2号。。。好像都正常嘛。等等,A什么时候死的?2005年,要中毒也不会是那么久以前的事情吧,好让我们直接跳到案发前一星期(使用条件中断),仔细观察,终于发现A先生是在昨天咖啡吧喝茶的时候中毒的,终于整个案件真相大白了。

作为一个有经验的侦探,一般都可以在第2步分析可疑人物中得出结论,只有那些非常棘手的案子,才会用到第3步。

下面要将的是另外一种案子,叫做密室谋杀案,在这个案子中我们所有的ASSERT线人都被隔离在密室之外了,这就是恐怖的Release调试。由于现在侦破技术的先进性,对于一般的Release案件我们都可以通过Debug案件再现的方式来侦破,但是有一些案件,它只会在密室条件下发生,当密室的门窗被打开的时候,案件就不再发生了,也就是Release时会有问题而debug没有问题。

1.发生这种事情最大的可能性是内鬼作案,也就是有个ASSERT线人干的,比如:

ASSERT((m_hWnd = GetHandle()) != NULL);

显然在密室情况下,ASSERT就不再给m_hWnd喂食,导致程序饿死。在这种情况下,我们需要为自己在密室里偷偷开个天窗,在Debug下使用NDEBUG宏,让有问题的ASSERT以为还是在密室,实际上我们正在偷偷的观察他呢。

当然在Debug下还会对内存和变量进行初试化而Release不会,这些都可以通过这种方法来排除。

2.如果发现不是上面的问题,我们就只好对Release进行案件再现了。在Release环境设置中debug info设置成为program database,link中设置generate debug info,然后就可以调试了。


最后我们要说的是,单纯的靠破案打击犯罪分子是下下之策,我们要从其他方面着手,降低犯罪率。

根据我们侦破的经历,我们也发现营造一个好的社会氛围能够降低犯罪率,同时好的安全措施也会降低犯罪率,同时在案发是也可以使我们更快的抓到凶手。

1.病从口入:对于中毒类案件,我们之需要对所有接触的食物进行病毒检验即可。我们对入口和出口条件用if进行判断,对有问题的一律不处理。但是这也有个问题,皇帝是万岁之躯,用银针或者随便找个太监试菜是没有问题,如果我们每天吃东西,都要用银针试一下,不是太麻烦了?所以我们也用ASSERT线人来帮我们试菜。现用debug模式,试个几个月,确定这个人做的在没有问题,我们在Release下就可以放心的吃了。而且即使发生问题,案件重现时ASSERT也会发现凶手的。所以

针对并从口入,我们一般用if来对重要出入口变量进行判断,用ASSERT对其他出入口变量进行断言。

2.小心高利贷:由于经济问题,我们时常会向社会申请贷款--申请静态空间,当然有时候也会向高利贷借钱来应应急--申请动态空间。我们在使用这些钱的时候要特别小心,千万不要透支阿,否则死了都不知道自己是怎么死的。

#include <MEMORY.h>
void main()
{
int *father = new int[2];
int *child = new int;

*child = 3;
memset(father, 24, 120);
}

看看这段家庭悲剧吧,父亲欠下巨额赌资,儿子被人砍翻。血与火的教训阿,同志们,根据我们对现在最新犯罪率的统计,这类案件的上升趋势很明显阿,而且由于高利贷借贷的隐蔽性,破案取证也非常困难。所以

在对一块内存赋值的时候,请务必做好边界判断。

3.不要以权谋私:某些ASSERT先生,不好好的当人民的公仆,却在下面偷偷的搞点小动作,以为能够蒙混过关,但是人民的眼睛是雪亮的,所以所有的ASSERT还是好好做好自己的本值工作,不要对代码进行任何的影响。当然自律是不够的,所以

我们要加强监控,每隔一段时间进行诚信测试--跑Release版本,看是否正常。

4.从娃娃抓起:好的开始是成功的一半,不过现在群众的功利心好像越来越重了,浮躁之风有越刮越猛的势头,很多大学生都想辍学搞事业,学什么billgates。我们写程序的时候可不能这样,所有的变量都应该初试化,虽然效率稍微低了点,但收益是很明显的嘛。最近未成年人犯罪事件有抬头的趋势,所以我们呼吁:

为了所有程序的健康,请给每个变量都初试化吧。

5.应急方案:当案件发生时,可能程序当时并未死亡,如果当时A大声呼救的话,周围的邻居还是可以听到的。程序里的异常处理机制就是try,catch,具体的用法我就不多说了,只说一句:

尽量多用try,catch吧,总比不要好,不过记得debug的时候要屏蔽掉,否则调试会很麻烦--你一叫罪犯就跑了嘛。


最后还是要强调一句,未雨绸缪永远比亡羊补牢来的好,所以多看后5条。


正文完

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 06:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表