android投屏程序线程无故卡死不执行,如何分析?

2024-04-08 20:52

本文主要是介绍android投屏程序线程无故卡死不执行,如何分析?,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

hi,粉丝朋友们:
大家好!近期做了一个车载互联,云手机相关的投屏的小项目demo,具体效果如下:
在这里插入图片描述

是不是感觉有点厉害哈,可以云手机远程控制,但是意外就出现了。。。

比如像如下这样拼命操作一下:
真正勇士应该经得住任意的考验

在这里插入图片描述

很遗憾发现一阵疯狂触摸操作后,居然客户端再也没有办法触控了,处于gg状态,触控后服务端的手机再也没有相关的反应,但是服务端依然是可以自己操作,也可以传递画面的变化给客户端

针对这这个无法操控问题要展开分析应该如何呢?

分析问题

针对这个客户端控制服务端触摸操作无反应问题,有以下几个方面定位排查:

1、怀疑进程直接异常崩溃

这个可以从日志,和操作行为可以看出,客户端和服务端,画面还是可以同步的,说明不存在异常退出这种情况发生,客户端日志也没有发现有任何报错,故排除程序自身异常退出导致问题

2、客户端没有传递相关的触摸数据

这个看着现象是有这个可能,但是经过客户端日志打印,发现也是正常进行了触摸数据的传递

3、服务端不接受触摸数据

这个也只能加日志相关的打印看看,发现日志在客户端无法触摸控制后就完全停止了,再也没有打印出相关的日志。故问题就明显指向是不是这个线程卡死了,连日志都不打印了,,,这个怀疑是正常的。
但是为啥会卡死呢?
怀疑又有以下两个方面:
怀疑1:
是不是接受不到数据,一直处于read服务端数据发过,一直处于阻塞状态?
这个也对read方法的前后加了很多打印,伪代码如下

Log.i("read ------start ");
read()//读取网络数据
Log.i("read ------end ");

发现卡死最后一句日志,并不一定是start这里停留,理论上如果read卡死那每次卡死肯定是有start没有end。所以经过日志也要排除这个可能

怀疑2:
是不是线程有其他方法阻塞?是否可以通过systrace/perfetto查看?
现在没有更多线索只能继续排查,用perfetto抓trace看线程是不是有啥卡住任务,具体trace如下图所示:
在这里插入图片描述
所以systrace其实也没有看出卡住时候是在等待啥,有啥一直运行的任务,所以perfetto好像也没有解决线程为啥卡死在一个地方

绝招方式解决

上面几种常见的分析思路和工具好像都没有很好的办法来分析出根本问题,现在就只知道线程卡死不动了,还不是网络阻塞。。。也不知到线程这个时候到底怎么了。。
想想线程卡住不动肯定处于某个状态,是否可以根据线程这个时候的具体状态信息反推出可能问题呢?
可以通过ps -T方式查看相关进程的线程目前运行情况和状态
具体命令如下:

adb shell ps -T  -p 进程号

注意:这个可能需要是userdebug机器

在程序卡住时候可以看看进程状态:
在这里插入图片描述
可以看到客户端触摸服务端无响应时候,这个时候服务端线程状态居然是pipe_write这样一个执行状态,说明是一直阻塞在这个地方。

那么问题来了,程序中哪里有啥地方会进行这个pipe_write操作呢?
哈哈,说实话这个就比较难想到了,一般要app层面追踪也很难,这里一般能想到程序中会有这个写入一般只有一个控制台的输出了。

             System.out.println(PREFIX + "WARN: " + message);

如上面这个 System.out.println方法,他就是需要进行pipe_write
一般android里面不是不用这个打印日志么?都是Log.i,一般情况是这样,但是投屏时候为了方便直接shell触发执行,方便直接terminal看输出情况,所以使用了这个System.out.println

问题分析到这里,那么考虑把程序中所有的System.out.println屏蔽了试试
在这里插入图片描述
其实也可以用kill -3这种获取堆栈看看到底卡在哪里:
在这里插入图片描述
一样发现是System.out.println这方法

屏蔽后发现一切运行完美。

总结:

在针对线程无故卡死情况,日志方面也不打印输出情况,需要考虑多个手段来尝试定位分析出目前的线程状态,然后根据状态反推出程序中可能的疑点,最后尝试修改验证。

本文章更多详细代码和资料需要购买课程获取
hal+perfetto+surfaceflinger
https://mp.weixin.qq.com/s/LbVLnu1udqExHVKxd74ILg
在这里插入图片描述

私聊作者+v(androidframework007)

其他课程七件套专题:在这里插入图片描述
点击这里
https://mp.weixin.qq.com/s/Qv8zjgQ0CkalKmvi8tMGaw

视频试看:
https://www.bilibili.com/video/BV1wc41117L4/

这篇关于android投屏程序线程无故卡死不执行,如何分析?的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/886426

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在MySQL执行UPDATE语句时遇到的错误1175的解决方案

《在MySQL执行UPDATE语句时遇到的错误1175的解决方案》MySQL安全更新模式(SafeUpdateMode)限制了UPDATE和DELETE操作,要求使用WHERE子句时必须基于主键或索引... mysql 中遇到的 Error Code: 1175 是由于启用了 安全更新模式(Safe Upd

Android里面的Service种类以及启动方式

《Android里面的Service种类以及启动方式》Android中的Service分为前台服务和后台服务,前台服务需要亮身份牌并显示通知,后台服务则有启动方式选择,包括startService和b... 目录一句话总结:一、Service 的两种类型:1. 前台服务(必须亮身份牌)2. 后台服务(偷偷干

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

java父子线程之间实现共享传递数据

《java父子线程之间实现共享传递数据》本文介绍了Java中父子线程间共享传递数据的几种方法,包括ThreadLocal变量、并发集合和内存队列或消息队列,并提醒注意并发安全问题... 目录通过 ThreadLocal 变量共享数据通过并发集合共享数据通过内存队列或消息队列共享数据注意并发安全问题总结在 J

C#使用DeepSeek API实现自然语言处理,文本分类和情感分析

《C#使用DeepSeekAPI实现自然语言处理,文本分类和情感分析》在C#中使用DeepSeekAPI可以实现多种功能,例如自然语言处理、文本分类、情感分析等,本文主要为大家介绍了具体实现步骤,... 目录准备工作文本生成文本分类问答系统代码生成翻译功能文本摘要文本校对图像描述生成总结在C#中使用Deep