[赚外快]警惕Delphi的VCL组件多线程访问的不安全性

[作者]
网名: 猪头三
站点: http://www.x86asm.com
Email: pliceman_110@163.com
QQ: 643439947
编程生涯: 2001~至今[11年]
职业生涯: 9年
职业岗位: 通用软件架构师 通用软件技术总监 通用软件研发工程师
开发语言: C/C++; x86asm; Object Pascal; C#;
开发工具: VC++; Delphi;
研发领域: Windows应用软件安全; Windows系统内核安全; Windows系统磁盘数据安全;
技能种类: 逆向 驱动 磁盘 文件

[起因]
同行的朋友把我推荐给本地一家小型的软件开发公司,希望我能去解决他们遇到的一个程序崩溃问题。由于对方老板希望他们的软件能在第二天发布新版本。但不幸的事情发生了,软件没有通过压力测试。

[症状]
该软件是用新版的delphi xe开发,在重复执行软件上的“扫描”功能2次,然后再退出程序,就导致软件崩溃。这给用户带来不好的体验。

[对方老板要求]
希望我能在当日中午之前找出错误并提供合理的技术解决方案,然后以方便公司的程序员能够有充足的时间修改BUG,如期发布新版本。

[我的要求]
由于本人是早上过去比较早,10点就到了,因此我对老板的要求无异议,也就顺理成章地跟老板谈起了技术顾问的价格。

[要价1万人民币]
在本地行业内,我是公认要高价的人。只有高价格才能体现我的技术含量和经验。这次的价格我是凭感觉,解决这个BUG,直接定位1万人民币。另一个根据他的软件商业市场潜力,未来会给他带来更多的收益,所以我觉得这个1万人民币,对于老板来说不算什么。果然老板很爽快答应。那就按照业内行规,先预支付3000元,让我开工,如果解决不了 ,我就吐完3000千。解决了就结尾款。

[开始解决BUG]
1> 让公司的测试部人员把BUG重新给我看,进行评估。结果错误显示是:内存访问出错。但这个内存访问出错的时机不是在功能运行时报错,而是功能执行完之后,退出报错。更离谱的是,功能需要重复执行2次,才能激活这个BUG。有点意思。
2> 马上让公司的程序员进行远程调试,让Delphi xe开发工具把错误信息更详细的呈现出来。结果有点悲剧,错误没有定位在源码上,而是一大堆汇编。心里也就大概明白为什么公司愿意让我来解决,因为这个已经不是公司程序员的处理范围了。
3> 我跟旁边的程序员说,遇到这种问题,先别慌。应该先看看 程序堆栈 能提供什么信息。这时调出 Delphi xe的堆栈窗口,看到了一堆系统函数,然后最下面出现了几个让我振奋的信息: getDc() TComponet TControl等跟Delphi VCL可视控件有关的函数和类名。
4> 凭经验推断,应该是软件的控件出现异常了。那么Delphi的控件在运行时出现异常,最普遍的就是多线程不安全性访问引起的。接着我就继续咨询身边的程序员,让他说出该功能的代码处理逻辑。果然证实我的设想是对的,该功能的代码逻辑处理,使用了大量的多线程。但由于代码太大,他们不知道由哪个模块引起的。
5> 开始精简逻辑。就因为代码量大,因此我们必须先把逻辑精简话,该功能一共有10个模块,我让他们把10个模块按照功能的执行顺序,从头到尾慢慢放开,一个一个测试。
6> 功夫不负有心人,经过测试发现,导致出错的正好是第7个模块,天助我也。让我发现了。然后我们继续针对第7个模块进行代码审核,结果发现,有一处代码涉及到了VCL组件多线程访问的同步问题,没有使用Synchronize()方法进行同步。估计是这个引起的,索性让程序员修改这段代码。在进行测试。
7> 大功告成,经过修改后,BUG已经不在重现了。

[总结]
自个分析了一下,其实我认为该公司的程序员肯定是知道Synchronize()方法的含义,只是写漏而已。当然我也不排除他们偷懒的行为,因为代码量多了,越堆越高,慢慢得代码也就越写越随意,该用Synchronize()方法同步的时候也不用了,贪快。结果软件不稳定了,BUG复杂化了,超出了他们的技术能力范围。很多公司都是这样,见怪不怪了。导致这种情况是多方面的,比如待遇低下,开发周期短,技术基础薄弱等都导致软件质量问题的不合格。

[收款走人]
这次解决BUG花费了3个小时,弄到中午1点,老板算是满意,结算尾款7000人民币,共计10000人民币。大家寒暄一下,吃了一餐饭,就各自走人。



评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我不是代码教父

我的创作动力离不开你的真诚激励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值