解决程序无响应

最近在解决一个程序无响应的问题上面花了不少时间,总算是找到了原因,下面简单记录一下查找的过程。
        
        先说一下场景:A程序为windows 桌面应用程序,界面基于QT,B程序为C#程序,在B中使用了windows自带的MSAA服务的IAccessible来操作A的一些界面功能。在操作过程中出现A,B进程同时无响应。A代码庞大,并且出现无响应的概率不大,无法直接进行调试。

        对于一般的程序无响应,首先想到的应该就是是否有死循环,这个直接通过任务管理器的CPU占用就可以判断,CPU没有占满,那么就可以直接排除;另外就是死锁,对于一般的死锁,可以打开任务管理器 -> 性能 -> 资源监视器来查看无响应程序的线程等待链,通过线程等待链找到相互等待的线程,获取堆栈分析原因。

        在我的程序出现问题时,按以上原因逐项查看。。。什么? 没有死循环,也没有线程等待链,这。。。再检查一遍,还是没有!!!没办法,只能attach调试,发现等待发生在QMetaObject的addGuard中,在addGuard中确实用了QMutexLocker,但是怎么会没有线程等待呢,想了很久无果后才查看了QMutexLocker的实现,这东西竟然使用的是Event实现的,恍然大悟,终于知道了为什么以上方法都不对:对于一般的Mutex来说,他是有归属的,而对于Event来说,没有归属,Event在wait后,其他任何地方都可以通过reset来使他恢复,所以就不会有等待链。

        分析了addGuard的代码,他只是一个很简单的操作,并且也是QT自己内部使用,应该不会出现常规的一些问题,初步估计可能出现在其他线程访问时刚好线程出现异常或线程终止,于是添加了hook函数来监测TerminateThread的调用情况,未发现异常。AB程序同事无响应,那么很有可能是在AB之间通信时出现了某种问题导致卡住。查阅COM相关介绍及MSAA,了解到在系统自带的COM组件中,一般都会在最外层做try catch来捕获调用时出现的异常,从这里可以想到很有可能出现在B调用COM时,COM在回调A程序时,发生异常,而这种异常刚好被异常捕获处理,未发生崩溃,A程序未能调用reset,导致B程序也无法等到回应,两个程序卡住。

        到这里,可以添加部分代码来验证猜测了。于是对COM回调的A程序的代码全部加异常捕获,看看执行时是否会出现exception,经验证,确实出现了,查看出现的位置原因,发现出现时一个QPointer<QWidget>对象,他的指针存在,但是内部数据都没有了,QPointer在说明中他是会在对象删除时自动删除引用的,唯一可能出现的原因应该就是在多线程里面删除导致QPointer也没有正确记录,对客户端编程来说,UI对象在非UI线程操作都可能导致严重的问题,在JAVA里面已经明确限定这一点,如果存在非UI线程操作UI对象,将直接报错,而C++不做任何处理,导致了给部分人犯错的可能。

    接下来要做的就是对我们使用的UI对象在他的析构函数里面加检测,判断他的删除操作是否在UI线程中,不在UI线程中直接使程序崩溃,记录堆栈。我是直接修改了QT的QWidget,用修改过后的QT来跑之前的操作,从程序的崩溃中就可以直接看出什么地方做了不该做的事。
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
安卓APK弹出程序响应的情况通常被称为ANR(Application Not Responding)。ANR主要分为两类:长时间无法执行完成(Timeout)和异常崩溃(crash)。其中,ANR的产生原因有多种,包括UI线程响应超时、当前事件被阻塞、当前事件耗时过长等。根据ANR产生原因不同,超时时间也不尽相同。在Android中,ANR可以对应到四大组件中的三个,即Activity/View、BroadcastReceiver和Service。例如,当View的按钮事件或触摸事件在特定时间内无法得到响应、BroadcastReceiver的onReceived方法在特定时间内无法完成处理、Service的各个生命周期函数在特定时间内无法完成处理时,都可能导致ANR的发生。为了检测ANR问题,Google官方提供了一个检测工具,可以通过下载Google官方的veridex来进行使用。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* [浅析 Android 系统稳定性中应用程序 ANR 无响应原因](https://blog.csdn.net/m0_62167422/article/details/126726594)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [郭全蛋的安卓笔记-Android APK出现无响应(alibaba fastjson),该如何解决!](https://blog.csdn.net/qq_40287196/article/details/109067621)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [android 高版本无法正常启动,偶尔会报应用程序响应(ANR)](https://blog.csdn.net/x158454996/article/details/127450907)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值