做了一个可以导入数据文件的程序,客户打电话来说处理的文件超过50个左右时,会发生死机现象。但是我这里试验,上百个文件都没有问题。这就很奇怪了。
经过详细询问,得知客户使用的是98系统,估计配置也不怎么样。但是有一点值得注意,由于数据文件是不断有新的进来处理,所以他们用了导入后删除的功能。最后实在没有办法,动态调试。结果发现,不知道谁在里面放了个MessageBox,导入完毕以后显示一个对话框,提示被删除的文件名。而问题的根源正是这个MsgBox!
经过调试发现,当文件在600个左右的时候,文件名列表可以达到21k……然后我用的赛扬2.4就开始抽风……
归根结底,这是对msgbox的不当使用。
幸好手头有份MessageBox的代码,就看了看,没有发现什么奇怪的地方。除了有几个LocalAlloc,MBToWCS可能是问题所在以外就没有什么可疑之处了。
那么,请出flydbg(偶兄弟的修改作品,嘿嘿……),按照源代码开始跟踪。一直跟到实际绘图的函数前面,都没有什么异常。而LocalAlloc,MBToWCS已经全部过掉了。再往下……DrawTextExW,顿住了!看来问题就在这里。21k的东西,一次性用Draw画上来……在我的机器上,6k的东西要1分20秒左右,确实有点慢。客户的机器当然远远不如我用的,当然会以为是死机!
本来想用线程写个改进版,但一想不实际。毕竟这玩意只是拿来提示少量信息的。那位用这个东西显示列表的老兄还真是不一般地强。
其实我一开始还用过syser和windbg,但是实在不顺手……还是olly最好。顺便给偶兄弟的flydbg做个广告。