MFC写的程序,运行一段时间后界面变白卡死什么原因?

时间:2022-09-21 15:25:14
MFC写的程序,程序比较大,没法贴代码,程序里有socket网络通信,有线程,界面还有贴图的bitmap,
,还有使用了skinH的皮肤插件
运行一段时间后,程序就变白卡死了,或者有时间就直接一闪程序就消失了,

这一般是什么原因啊?

15 个解决方案

#1


1运行一段时间后,程序就变白卡死了
>这类问题主要是,你程序写的逻辑问题,锁,事件,WaitXXX函数用的不好,DEADLOCK了
或者更低级的,你逻辑上写成死循环,死递归了
2 有时间就直接一闪程序就消失了
〉这个主要是内存破坏,例如,使用野指针,数组越界使用,删除了正在用的指针,内存不足,API的返回数没有判断等等

#2


用dbgview 来检测

#3


应该资源没有回收,内存泄漏,过一段时间,没有资源可用了

#4


一楼的第一个可能性最大!
但如果有网络通讯的话,有可能是同步类型的通讯造成程序假死
楼主可以先看看任务管理器里的CPU占用,如果是整个核都占了的话(意思是说2核的CPU占50%,4核CPU占25%)
那肯定是1楼的第一个可能性了

#5


引用 1 楼 q1q2q3q4ln 的回复:
1运行一段时间后,程序就变白卡死了
>这类问题主要是,你程序写的逻辑问题,锁,事件,WaitXXX函数用的不好,DEADLOCK了
或者更低级的,你逻辑上写成死循环,死递归了
2 有时间就直接一闪程序就消失了
〉这个主要是内存破坏,例如,使用野指针,数组越界使用,删除了正在用的指针,内存不足,API的返回数没有判断等等


晕 这么麻烦,那解决这个问题要老麻烦了是吧? 程序代码好多的

#6


引用 4 楼 Sandrer 的回复:
一楼的第一个可能性最大!
但如果有网络通讯的话,有可能是同步类型的通讯造成程序假死
楼主可以先看看任务管理器里的CPU占用,如果是整个核都占了的话(意思是说2核的CPU占50%,4核CPU占25%)
那肯定是1楼的第一个可能性了


这样的问题怎么排查解决啊?

#7


调试器跟踪

如果不会,就用笨办法
一点点的关闭部分功能
或者一点点的打开部分功能
看看是那块卡住了

看你描述的情况,
感觉多线程出问题的可能性最大,错在访问数据没有同步

#8


引用 7 楼 wwwspider001 的回复:
调试器跟踪

如果不会,就用笨办法
一点点的关闭部分功能
或者一点点的打开部分功能
看看是那块卡住了

看你描述的情况,
感觉多线程出问题的可能性最大,错在访问数据没有同步


这个好像是随机的,不一定什么时候会发生一闪消失的情况,运行时间长一点的话 ,每次都会发生,发生在什么时刻就不一定,这个怎么调试啊? 

#9


在多线程里面,看看有没有访问外部变量,新建对象,删除对象之类的操作,考虑一下,在如果可能发生一个在删除,一个在使用等可能引发冲突的地方,加个锁,应该可以解决问题

用vs的Debug模式启动运行,等待软件发生异常,看看停在哪,就可以看到哪里出错了

#10


1 如果不会,就用笨办法
 一点点的关闭部分功能
 或者一点点的打开部分功能
 看看是那块卡住了
>>>恩这个很基本
2 另外就是加LOG输出,不过有时候,加了后问题可能不再现了,因为程序运行变慢,问题就不容易出了
3 这类问题确实非常麻烦,无论你用的是JAVA,C#,还是什么,线程同步出问题,都要慢慢查
4 内存破坏类的可以找些工具,不过最后很可能需要用1来解决
-----------
LZ你有时间要花费了
如果是你自己写的程序可能还好,如果都是别人写的,并且代码很多,那你有得干了 MFC写的程序,运行一段时间后界面变白卡死什么原因?

#11


生成Dump文件,

#12


有可能是gid资源泄漏。。。

#13


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#14


打开任务管理器,看看句柄和虚拟内存.........尤其是句柄,一边运行一边看句柄数.......

#15


这个需要你的一点点排查了,很麻烦。
先判断断逻辑,然后看看看网络通信的线程等等的优先级
检查有没有死循环……

#1


1运行一段时间后,程序就变白卡死了
>这类问题主要是,你程序写的逻辑问题,锁,事件,WaitXXX函数用的不好,DEADLOCK了
或者更低级的,你逻辑上写成死循环,死递归了
2 有时间就直接一闪程序就消失了
〉这个主要是内存破坏,例如,使用野指针,数组越界使用,删除了正在用的指针,内存不足,API的返回数没有判断等等

#2


用dbgview 来检测

#3


应该资源没有回收,内存泄漏,过一段时间,没有资源可用了

#4


一楼的第一个可能性最大!
但如果有网络通讯的话,有可能是同步类型的通讯造成程序假死
楼主可以先看看任务管理器里的CPU占用,如果是整个核都占了的话(意思是说2核的CPU占50%,4核CPU占25%)
那肯定是1楼的第一个可能性了

#5


引用 1 楼 q1q2q3q4ln 的回复:
1运行一段时间后,程序就变白卡死了
>这类问题主要是,你程序写的逻辑问题,锁,事件,WaitXXX函数用的不好,DEADLOCK了
或者更低级的,你逻辑上写成死循环,死递归了
2 有时间就直接一闪程序就消失了
〉这个主要是内存破坏,例如,使用野指针,数组越界使用,删除了正在用的指针,内存不足,API的返回数没有判断等等


晕 这么麻烦,那解决这个问题要老麻烦了是吧? 程序代码好多的

#6


引用 4 楼 Sandrer 的回复:
一楼的第一个可能性最大!
但如果有网络通讯的话,有可能是同步类型的通讯造成程序假死
楼主可以先看看任务管理器里的CPU占用,如果是整个核都占了的话(意思是说2核的CPU占50%,4核CPU占25%)
那肯定是1楼的第一个可能性了


这样的问题怎么排查解决啊?

#7


调试器跟踪

如果不会,就用笨办法
一点点的关闭部分功能
或者一点点的打开部分功能
看看是那块卡住了

看你描述的情况,
感觉多线程出问题的可能性最大,错在访问数据没有同步

#8


引用 7 楼 wwwspider001 的回复:
调试器跟踪

如果不会,就用笨办法
一点点的关闭部分功能
或者一点点的打开部分功能
看看是那块卡住了

看你描述的情况,
感觉多线程出问题的可能性最大,错在访问数据没有同步


这个好像是随机的,不一定什么时候会发生一闪消失的情况,运行时间长一点的话 ,每次都会发生,发生在什么时刻就不一定,这个怎么调试啊? 

#9


在多线程里面,看看有没有访问外部变量,新建对象,删除对象之类的操作,考虑一下,在如果可能发生一个在删除,一个在使用等可能引发冲突的地方,加个锁,应该可以解决问题

用vs的Debug模式启动运行,等待软件发生异常,看看停在哪,就可以看到哪里出错了

#10


1 如果不会,就用笨办法
 一点点的关闭部分功能
 或者一点点的打开部分功能
 看看是那块卡住了
>>>恩这个很基本
2 另外就是加LOG输出,不过有时候,加了后问题可能不再现了,因为程序运行变慢,问题就不容易出了
3 这类问题确实非常麻烦,无论你用的是JAVA,C#,还是什么,线程同步出问题,都要慢慢查
4 内存破坏类的可以找些工具,不过最后很可能需要用1来解决
-----------
LZ你有时间要花费了
如果是你自己写的程序可能还好,如果都是别人写的,并且代码很多,那你有得干了 MFC写的程序,运行一段时间后界面变白卡死什么原因?

#11


生成Dump文件,

#12


有可能是gid资源泄漏。。。

#13


您好
我是本版版主
此帖已多日无人关注
请您及时结帖
如您认为问题没有解决可按无满意结帖处理
另外本版设置了 疑难问题汇总帖
并已在版面置顶
相关规定其帖子中有说明
您可以根据规定提交您帖子的链接
如您目前不想结帖只需回帖说明
我们会删除此结帖通知

见此回复三日内无回应
我们将强制结帖
相关规定详见界面 界面版关于版主结帖工作的具体办法

#14


打开任务管理器,看看句柄和虚拟内存.........尤其是句柄,一边运行一边看句柄数.......

#15


这个需要你的一点点排查了,很麻烦。
先判断断逻辑,然后看看看网络通信的线程等等的优先级
检查有没有死循环……