读书人

VC6.0编译的一个软件BUG解决方案

发布时间: 2013-09-05 16:02:07 作者: rapoo

VC6.0编译的一个软件BUG
具体情况如下:

所用技术和环境说明:
公司的程序是在VC6.0编译器,里面的代码是用C++编写。
主要涉及到的技术有,access/oracle数据库的使用、多线程、串口通信。

程序基本流程说明:
程序分两大部分,一部分是场地设备的数据采集,一部分是监控室对数据的分析判断。场地设备主机先采集数据,然后通过串口把数据传给监控室主机,软件去读取串口的数据,在对数据进行相应的分析判断。

BUG情况说明:
现有程序遇到这样一个问题,当场地设备主机与监控室程序进行通信,如果连接的场地设备数一旦很多,即COM口传递的数据很多时,程序会弹窗报错,点击确定以后,程序退出。报错的提示信息是:该内存不能为read。且该报错无规律,不可重现。倘若场地设备主机没有数据传给监控室,则程序可以正常运行,没有错误。

这个BUG到现在为止,我们没有找出来,不知道是在哪个部分出错了,是程序判断?是串口通信?是多线程?不得而知。更不用说深入到技术细节,是数组越界?野指针?内存溢出?都不得而知。

这份代码是公司一个老员工写的,到现在有五六年了,且这个问题从一开始就存在,一直没有找出这个BUG。这个老员工现在也找不出BUG的原因。我们尝试过给临界资源加锁,但是没有解决。

我们尝试过其它很多种解决办法,该内存不能为read,以这个提示信息找过的方法全试过了,无法解决。我们想过很多曲线迂回的方法,现场调试过多次,但都是只能缓解,无法彻底解决这个问题。

现在我们希望通过CSDN求助,来解决这个问题。
因为公司保密性的原因,无法透露其它更多具体细节,我们真心希望有实力有技术有经验的人来帮忙,公司的源代码因为还是五六年前的,也难免有些冗长繁杂,不一定需要你来帮我们解决问题,只要你找出问题的所在。如果你觉得还有什么其它你想知道的问题,请回帖说明。

请再次从头到尾看一遍整个情况的说明,所用到的技术和BUG的现象说明,如果到这个时候,你还是觉得有把握,想尝试一番,请发私信联系我。

谢谢大家。
软件 bug VC
[解决办法]
SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
MyUnhandledExceptionFilter是自定义函数

强制注册崩溃回调。

然后再MyUnhandledExceptionFilter之中调用MiniDumpWriteDump输出dump文件

可以用windbg分析dump文件,或者高版本的VS直接打开dmp文件会直接指向你的崩溃点。

PS:该方法对于内存碎片,内存不够的崩溃无法定位。



[解决办法]
就是3楼的方法,崩溃时生成dump,然后使用windbg配合pdb、源码分析,一般就能找到崩溃的地方,再慢慢分析,就能找到导致崩溃的原因了。
见这个使用SetUnhandledExceptionFilter转储程序崩溃时内存DMP
[解决办法]
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。

读书人网 >VC/MFC

热点推荐