lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:1390回复:9

关于软件的稳定性问题!

楼主#
更多 发布于:2003-06-02 14:22
到这个版来是因为这个版的人气旺!我的问题是关于VC++6软件的稳定性问题,与USB无关,希望版主见谅。
任务:32个文件并发读取,把数据组织起来,通过PCI卡输出。
硬件环境:1.7G赛扬4CPU、256M内存、自己设计的PCI卡。
软件环境:WIN2K专业版、自己开发的PCI驱动
软件开发平台:VC6.0

问题是这样的:
软件中,为32个文件共申请两组64M共128M缓冲,两组缓冲交替使用,一个用来读数据,另一个用来组织上次已读取的数据并输出。每次读文件时,所有文件各读2M,两次读操作间隔约12秒。
软件刚写完进行测试时,只使用了8个文件用来测试(即从每个文件中一次读8M数据,凑足应有的数据量),软件连续运行一周没发现任何问题。后来,将软件修改为对32个文件访问,结果总是在运行到4个小时左右时,出现错误。错误表现为程序中定义的CEVENT对象不存在,或者是CFILE对象不存在。
由于错误出现前后,只修改过访问文件的数据,因此,问题可能会出操作系统文件缓冲区方面呢?因为WINDOWS会占用一半的物理内存,软件又占用一半物理内存当作文件缓冲区,那么在读文件时,总是实际读取的数据量要大于读请求的量,同时访问32个文件,会不会因占用的内存过大而导致系统不稳定?可是,如果系统不稳定出的错误,又没道理总是出现在软件运行四个小时左右,又似乎很有规律!

请教诸位,谢谢。
lvhaow
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
沙发#
发布于:2003-06-10 12:50
版主大哥:
引用您的话:
////////////////////////////////////////
你开个buffer[10],向里面写1000 byte看看?
memleak并不是只有一个现象。code被改变后的行为没有人可以预料!
///////////////////////////////////////
您说的这种情况是栈溢出,的确可能会改变CODE,导致错误,但这和内存泄漏是两码事情啊!
lvhaow
swf2003
驱动中牛
驱动中牛
  • 注册日期2003-02-13
  • 最后登录2011-10-28
  • 粉丝1
  • 关注0
  • 积分4分
  • 威望22点
  • 贡献值0点
  • 好评度20点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2003-06-10 10:59
另:
值注意的是软件采用的多线程结构。除了主线程外,还开了四个线程,分别是:
1、数据输出线程:调驱动,输出数据,并从驱动中获得硬件中断信息,同步其它线程的动作。
2、文件读取线程:通过在数据输出线程中置位的一个事件对象,触发执行32个文件的读操作。
3、数据整理线程:把读文件线程中获得的数据整理为适合输出的结构,并通过事件对象通知数据输出线程输出数据。
4、操作线程:从串口获得控制信息,以确定该输出什么文件。

这四个线程除了使用事件对象相互通信处,还使用了一些全局变量来表示状态,以及CString型对象来传递文件名。请问,不同线程访问同一个变量时,有没有可能发生冲突?会不会导致如前所述的故障。

谢谢。


全局变量一定要保护,比如临界区(Critical Section )等等同步方式
你的认可是对我最大的鼓励!
dalaba
驱动小牛
驱动小牛
  • 注册日期2001-09-12
  • 最后登录2007-06-08
  • 粉丝0
  • 关注0
  • 积分84分
  • 威望11点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2003-06-10 09:43
斑竹,请教如何定位哪里出现内存泄漏?我写了一个dll被vb程序调用,检测到内存泄漏,输出信息如下:
......
xxxxxx.DLL Terminating!
etected memory leaks!
Dumping objects ->
{59} normal block at 0x08364668, 1 bytes long.
 Data: < > CD
Object dump complete.
......
怎么解读这个信息?谢谢
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2003-06-10 00:08
另:
值注意的是软件采用的多线程结构。除了主线程外,还开了四个线程,分别是:
1、数据输出线程:调驱动,输出数据,并从驱动中获得硬件中断信息,同步其它线程的动作。
2、文件读取线程:通过在数据输出线程中置位的一个事件对象,触发执行32个文件的读操作。
3、数据整理线程:把读文件线程中获得的数据整理为适合输出的结构,并通过事件对象通知数据输出线程输出数据。
4、操作线程:从串口获得控制信息,以确定该输出什么文件。

这四个线程除了使用事件对象相互通信处,还使用了一些全局变量来表示状态,以及CString型对象来传递文件名。请问,不同线程访问同一个变量时,有没有可能发生冲突?会不会导致如前所述的故障。

谢谢。


共享资源当然应该用mutex互锁
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2003-06-10 00:06
谢谢版主。
内存泄漏将导致对内存资源占用的累积,其现象应该是系统变得迟缓而后直至死机。
可我遇到的情况并不是这样,首先,它的现象是定义的对象找不到,如果是内存泄漏,系统不会分配已分配的内存资源而使已存在的对象丢失;第二,故障现象是软件报错,告诉我某个内存地址不能访问,并没有死机。而且软件终止后重新运行,又完好如初。并不需要重新启动机器。
还请版主老兄给点建议,谢谢。


你开个buffer[10],向里面写1000 byte看看?
memleak并不是只有一个现象。code被改变后的行为没有人可以预料!
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
6楼#
发布于:2003-06-06 22:44
大哥们,帮忙给看看呀!
lvhaow
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
7楼#
发布于:2003-06-03 00:59
另:
值注意的是软件采用的多线程结构。除了主线程外,还开了四个线程,分别是:
1、数据输出线程:调驱动,输出数据,并从驱动中获得硬件中断信息,同步其它线程的动作。
2、文件读取线程:通过在数据输出线程中置位的一个事件对象,触发执行32个文件的读操作。
3、数据整理线程:把读文件线程中获得的数据整理为适合输出的结构,并通过事件对象通知数据输出线程输出数据。
4、操作线程:从串口获得控制信息,以确定该输出什么文件。

这四个线程除了使用事件对象相互通信处,还使用了一些全局变量来表示状态,以及CString型对象来传递文件名。请问,不同线程访问同一个变量时,有没有可能发生冲突?会不会导致如前所述的故障。

谢谢。
lvhaow
lvhaow
驱动小牛
驱动小牛
  • 注册日期2001-10-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分44分
  • 威望35点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
  • 社区居民
8楼#
发布于:2003-06-03 00:50
谢谢版主。
内存泄漏将导致对内存资源占用的累积,其现象应该是系统变得迟缓而后直至死机。
可我遇到的情况并不是这样,首先,它的现象是定义的对象找不到,如果是内存泄漏,系统不会分配已分配的内存资源而使已存在的对象丢失;第二,故障现象是软件报错,告诉我某个内存地址不能访问,并没有死机。而且软件终止后重新运行,又完好如初。并不需要重新启动机器。
还请版主老兄给点建议,谢谢。
lvhaow
rayyang2000
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2012-09-13
  • 粉丝3
  • 关注0
  • 积分1036分
  • 威望925点
  • 贡献值3点
  • 好评度823点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2003-06-02 18:06
比较可能的原因:内存泄漏
天天coding-debugging中----超稀饭memory dump file ======================================================== [b]Windows Device Driver Development and Consulting Service[/b] [color=blue][url]http://www.ybwork.com[/url][/color] ========================================================
游客

返回顶部