首页 新闻 搜索 专区 学院

程序莫名其妙随机卡住,无异常,十分诡异~

0
悬赏园豆:5 [已解决问题] 解决于 2009-05-05 18:04

我做了一个蜘蛛程序,用多线程爬网页,使用命令行同步输出日志信息,在主线程中每隔20秒(Sleep)输出一次统计信息。

该程序运行几十分钟后就会莫名其妙地随机卡住不动,不光子线程不会继续工作和输出,主线程也不再输出任何信息了,就这么一直卡住不运行了,但窗口并没有失去响应。

调试里窗口里没有看到未被捕获的异常,出现过的异常都在可控范围内,不影响流程;任务肯定是没有完全完成,每个线程也都没完成当次分配的任务;就算某一个线程里的网页访问超时也不该影响其他的线程,况且也有超时时限的;线程只有一处用到锁,应该不是死锁问题,我尝试过155个线程同时运转一大段时间也是正常的。

我的线程都设为了后台线程,应该和这个无关吧,后台应该也不会被Windows忽略吧。

怀疑是命令行输出时卡住,不知有没有这个可能呢?命令行是否有输出行数上限?我正在测试定时清屏是否有效。

各位朋友能帮忙想想解决办法么?

问题补充: 程序占用CPU和内存都很少,不会是资源枯竭导致的问题;没有什么巨量的运算;没发现有逻辑问题,即使有也不应该影响到包括主线程内的所有线程的。 没有死循环啊,死循环应该会有大量CPU或内存消耗吧,但根本没出现这个情况。 今天测试每隔20秒清屏,仍然是四小时后卡住不动了,卡住不动N小时后,我给关掉后,输出窗口显示了一条:程序“[3320] 蜘蛛测试.vshost.exe: 托管”已退出,返回值为 -1073741510 (0xc000013a)。 前台后台线程都测试了,同样情况。 程序只涉及到用webclient访问网页,以及命令行输出消息,除此之外就没有其他交互和读写了。 Thread的对象我都保留着对象引用的。 晕死了,还是没找到问题所在,卡住后在调试里点暂停后,VS也卡住不动了,VS的CPU占用率在10%-20%左右晃悠,关闭程序后VS那边出现对话框,提示“无法中断执行”,并且调试没有自动终止,点击停止后还提示说什么在运行中,问是否强制停止,太邪门了!
斯克迪亚的主页 斯克迪亚 | 老鸟四级 | 园豆:4124
提问于:2009-04-29 03:52
< >
分享
最佳答案
0

adplus -hang -pn 蜘蛛测试.exe -quiet -o c:\dumps

5分钟之后,再运行一次

5分钟之后,再运行一次

 

抓到三组,就差不多了。一般而言,CPU和Memory都死水微澜,说明你的程序hang在某个请求上了,如socket的、如sql query execution等,在等待他们的返回。

 

从设计的角度讲,你的程序应该加一个timeout的。

鞠强 | 菜鸟二级 |园豆:347 | 2009-04-29 11:50
其他回答(3)
0

无法确定你的问题,这个现成本来就是很麻烦的事情,控制不好就是你的这个样子,

大面上,你的这个用法,和大概的方法没有错。

邢少 | 园豆:10926 (专家六级) | 2009-04-29 08:49
0

有进入到死循环吧,没有代码也不好说、

sleep只是叫程序停下来一段时间,该卡的地方还是要卡的,如果要解决程序抢占主线程资源的情况可以考虑在繁忙的地方使用Application.Doevent()函数让程序处理在队列中等待的其它系统线程。

风海迷沙 | 园豆:4453 (老鸟四级) | 2009-04-29 11:11
0

1、Visual Studio 不是可以选择不同的线程调试吗?一个个看看都执行到哪里发生什么事了?

2、这个纯瞎猜,试一下将 ThreadStart 提升成字段,不要直接 new Thread(new ThreadStart(...))

DiryBoy | 园豆:639 (小虾三级) | 2009-04-29 11:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册