莫名其妙的问题,困扰我很久了,非常着急。现金悬赏,价格你开。c#开发的一个互联网搜索系统,几十个多线程并发运行。单独模块的测试都结束了,在系统整体试运行时,会不定期的产生僵死。僵死发生时,CPU使用率、下行带宽使用率均瞬时降为0。发生僵死后,系统界面无法刷新,显示为白屏。此时如果Visual Studio进行“中断”命令,Visual Studio也会一并失去响应。除非用“任务管理器”强行关闭测试系统,Visual Studio才能恢复响应。僵死后,不论多长时间都不会自行恢复正常。包括Visual Studio2003,Visual Studio2005都会发生同样情况。硬件描述:4核CPU,4G内存。下行带宽几M。在正常运行状态下,CPU使用率维持在50%~70%左右,4核使用率较为均衡,一般不会瞬时冲高到100%。在正常运行状态下,内存(包括虚拟内存)占用500M左右,也不会产生瞬时内存过大的情况。为了避免低效的IO硬盘操作影响系统速度,系统采用集中IO操作的机制,定时进行硬盘写入,但也会有零碎的硬盘读写发生,但量不会大。可以排除的一些常见原因:死锁、死循环、内存不足,机器硬件错误(因为2台测试机器均发生同样情况)、CPU负担过重、IE页面报错对话框的问题。
附带的一个问题:System.OutOfMemoryException 错误。虽然已经在配置文件\Aspnet.config 加入 <gcServer enabled="false" /> (工作站模式),但还是会偶尔出现这种错误,发生这种错误提示的时候,系统的内存使用大概在500M左右。会不会是因为c#对内存管理机制的问题导致出现这种僵死的发生?
不知道能否有什么调试、监测工具进行错误监测?同一个问题的另外一贴:http://topic.csdn.net/u/20090807/09/fdd894cd-1cfd-4e00-badf-c2f6e6b320e7.html 。
附带的一个问题:System.OutOfMemoryException 错误。虽然已经在配置文件\Aspnet.config 加入 <gcServer enabled="false" /> (工作站模式),但还是会偶尔出现这种错误,发生这种错误提示的时候,系统的内存使用大概在500M左右。会不会是因为c#对内存管理机制的问题导致出现这种僵死的发生?
不知道能否有什么调试、监测工具进行错误监测?同一个问题的另外一贴:http://topic.csdn.net/u/20090807/09/fdd894cd-1cfd-4e00-badf-c2f6e6b320e7.html 。
网上看到的也许有用
。net程序在托管堆中申请内存的时候因为没有足够的内存而挂掉了。楼主可以在每次需要大内存的操作之前手动做GC
还有就是楼主是否使用了很大的静态变量。有兴趣的话可以看看这个
.NET托管内存类应用的内存泄漏分析和诊断
之前我调试线程程序也出现过类似的情况,只不过我线程函数比较简单,所以恢复的快一点而已。恢复之后,VS会报异常,大概意思是说“你当前调试的线程已经退出”。我个人想法:
你调试的线程在你长时间不执行或者的debug的时候,会异常退出,为什么退出,你需要问问ms了。线程已经退出了,但是你仍然调用线程的资源,所以就报错了,这个异常一般是会等很久时间,会造成假死状态,估计是os在处理这个错误了。
2005的Debugger是在多线程程序调试方面有问题的,2008已经改进了。
2005的Debugger跨线程调试经常出问题
使用Debug模式编译
大概的意思是不光内存不足会引起这个问题,虚拟内存一样会导致这个问题你报这个错的时候占500M的物理内存,占了多少虚拟内存呢
还是从代码一步一步调试起,建议还是检查你所有调用的逻辑关系,每个模块调用与输出全部记录,当问题发生时去检查你的输出日志
这样才实际点,不然大家看不到东西,很难说出个所以然来
2. 涉及COM调用.这两种情况下VS调试有时候会卡死, 很麻烦.考虑多用log文件.