很奇怪,为何程序长时间运行后出现 “系统资源不足,无法完成请求的服务”

时间:2021-11-24 20:08:38
有个VC 程序,功能是不断地收发一个USB 设备命令,长时间运行后,就会出现:
     1  电脑屏幕显示变成很大字体的那种;
     2 此时打开比如网上邻居、任务管理器、设备管理器等 ,都会出现弹出对话框  “系统资源不足,无法完成请求的服务”;
程序运行期间,从任务管理起看,没有什么异常,内存、句柄数、现程数都稳定,而且电脑的内存使用也没有发现异常 ;
我用 bound check 检查代码,也没有发现特别泄漏什么的!
大家有遇到过否?或者有没有什么排查思路?谢谢 

13 个解决方案

#1


检查一下具体的句柄是否被占用完如:网络SOCKET通讯句柄,GDI的句柄不断增长...这样引起资源流失
还有你的VC程序是你自己写的,有源码?如果有源码,在收发数据时检查有没有异常情况没处理的,比如发生数据阻塞异常什么的,处理包数据解析处理是否得当?

#2


任务管理器中有一列是“gdi对象”,看看它有没有变得很大

#3


任务管理器检查内存和GDI句柄有无异常

#4


GDI句柄  ,  用户句柄  楼上都说了

#5


任务管理器中,查看GDI句柄。。。

#6




引用 5 楼 shen_wei 的回复:
任务管理器中,查看GDI句柄。。。


引用 3 楼 hushoubo 的回复:
任务管理器检查内存和GDI句柄有无异常


引用 2 楼 mayudong1 的回复:
任务管理器中有一列是“gdi对象”,看看它有没有变得很大


多谢各位 ,我特别留意了GDI 对象,都没有变化 ;
           用户对象 、线程数据 也都没有什么变化 !
           跟刚开始 运行差不多!

#7


引用 1 楼 jianghandaxue 的回复:
检查一下具体的句柄是否被占用完如:网络SOCKET通讯句柄,GDI的句柄不断增长...这样引起资源流失
还有你的VC程序是你自己写的,有源码?如果有源码,在收发数据时检查有没有异常情况没处理的,比如发生数据阻塞异常什么的,处理包数据解析处理是否得当?


代码都自己写。收发那块其实很简单,无非就是接收数据发送数据,都用ReadFile ,WriteFile 操作 !
我用BoundCheck检查也没有什么异常!

#8


你的USB是什么东西,  是否有驱动, 如果驱动有问题可能出现这个问题, 

任务管理器可以看看核心内存增加的多不多

#9


引用 7 楼 vc_learner 的回复:
Quote: 引用 1 楼 jianghandaxue 的回复:

检查一下具体的句柄是否被占用完如:网络SOCKET通讯句柄,GDI的句柄不断增长...这样引起资源流失
还有你的VC程序是你自己写的,有源码?如果有源码,在收发数据时检查有没有异常情况没处理的,比如发生数据阻塞异常什么的,处理包数据解析处理是否得当?


代码都自己写。收发那块其实很简单,无非就是接收数据发送数据,都用ReadFile ,WriteFile 操作 !
我用BoundCheck检查也没有什么异常!


那要是这样的情况,那就很头疼了。特别是需要长时间测试才能看见问题的程序...
在看看像sendmessge,postmessage有没有这样的发消息的地方,全部用postmessage处理

#10


自己看内存增加变化。。。

#11


引用 8 楼 zzz3265 的回复:
你的USB是什么东西,  是否有驱动, 如果驱动有问题可能出现这个问题, 

任务管理器可以看看核心内存增加的多不多


嗯我看了 ,核心内存不断增加, 
从 14:21  -----15:15 
      186048-----203820 
是不断增加趋势 ;
谢谢,我就从这个下手去排查; 

#12


搞定没?楼主,我也碰到一样的问题了

#13


检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!

搜“GDI泄露检测”

#1


检查一下具体的句柄是否被占用完如:网络SOCKET通讯句柄,GDI的句柄不断增长...这样引起资源流失
还有你的VC程序是你自己写的,有源码?如果有源码,在收发数据时检查有没有异常情况没处理的,比如发生数据阻塞异常什么的,处理包数据解析处理是否得当?

#2


任务管理器中有一列是“gdi对象”,看看它有没有变得很大

#3


任务管理器检查内存和GDI句柄有无异常

#4


GDI句柄  ,  用户句柄  楼上都说了

#5


任务管理器中,查看GDI句柄。。。

#6




引用 5 楼 shen_wei 的回复:
任务管理器中,查看GDI句柄。。。


引用 3 楼 hushoubo 的回复:
任务管理器检查内存和GDI句柄有无异常


引用 2 楼 mayudong1 的回复:
任务管理器中有一列是“gdi对象”,看看它有没有变得很大


多谢各位 ,我特别留意了GDI 对象,都没有变化 ;
           用户对象 、线程数据 也都没有什么变化 !
           跟刚开始 运行差不多!

#7


引用 1 楼 jianghandaxue 的回复:
检查一下具体的句柄是否被占用完如:网络SOCKET通讯句柄,GDI的句柄不断增长...这样引起资源流失
还有你的VC程序是你自己写的,有源码?如果有源码,在收发数据时检查有没有异常情况没处理的,比如发生数据阻塞异常什么的,处理包数据解析处理是否得当?


代码都自己写。收发那块其实很简单,无非就是接收数据发送数据,都用ReadFile ,WriteFile 操作 !
我用BoundCheck检查也没有什么异常!

#8


你的USB是什么东西,  是否有驱动, 如果驱动有问题可能出现这个问题, 

任务管理器可以看看核心内存增加的多不多

#9


引用 7 楼 vc_learner 的回复:
Quote: 引用 1 楼 jianghandaxue 的回复:

检查一下具体的句柄是否被占用完如:网络SOCKET通讯句柄,GDI的句柄不断增长...这样引起资源流失
还有你的VC程序是你自己写的,有源码?如果有源码,在收发数据时检查有没有异常情况没处理的,比如发生数据阻塞异常什么的,处理包数据解析处理是否得当?


代码都自己写。收发那块其实很简单,无非就是接收数据发送数据,都用ReadFile ,WriteFile 操作 !
我用BoundCheck检查也没有什么异常!


那要是这样的情况,那就很头疼了。特别是需要长时间测试才能看见问题的程序...
在看看像sendmessge,postmessage有没有这样的发消息的地方,全部用postmessage处理

#10


自己看内存增加变化。。。

#11


引用 8 楼 zzz3265 的回复:
你的USB是什么东西,  是否有驱动, 如果驱动有问题可能出现这个问题, 

任务管理器可以看看核心内存增加的多不多


嗯我看了 ,核心内存不断增加, 
从 14:21  -----15:15 
      186048-----203820 
是不断增加趋势 ;
谢谢,我就从这个下手去排查; 

#12


搞定没?楼主,我也碰到一样的问题了

#13


检查是否资源泄漏的办法之一:
在任务管理器 进程 查看 选择列 里面选择:内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象
让你的程序(进程)不退出,循环执行主流程很多遍,越多越好,比如1000000次甚至无限循环,记录以上各数值,再隔至少一小时,越长越好,比如一个月,再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加,则铁定有对应资源的资源泄漏!

搜“GDI泄露检测”