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

相关文章

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

C++统计函数执行时间的最佳实践

《C++统计函数执行时间的最佳实践》在软件开发过程中,性能分析是优化程序的重要环节,了解函数的执行时间分布对于识别性能瓶颈至关重要,本文将分享一个C++函数执行时间统计工具,希望对大家有所帮助... 目录前言工具特性核心设计1. 数据结构设计2. 单例模式管理器3. RAII自动计时使用方法基本用法高级用法

Java实现远程执行Shell指令

《Java实现远程执行Shell指令》文章介绍使用JSch在SpringBoot项目中实现远程Shell操作,涵盖环境配置、依赖引入及工具类编写,详解分号和双与号执行多指令的区别... 目录软硬件环境说明编写执行Shell指令的工具类总结jsch(Java Secure Channel)是SSH2的一个纯J

Java中如何正确的停掉线程

《Java中如何正确的停掉线程》Java通过interrupt()通知线程停止而非强制,确保线程自主处理中断,避免数据损坏,线程池的shutdown()等待任务完成,shutdownNow()强制中断... 目录为什么不强制停止为什么 Java 不提供强制停止线程的能力呢?如何用interrupt停止线程s

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

python 线程池顺序执行的方法实现

《python线程池顺序执行的方法实现》在Python中,线程池默认是并发执行任务的,但若需要实现任务的顺序执行,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录方案一:强制单线程(伪顺序执行)方案二:按提交顺序获取结果方案三:任务间依赖控制方案四:队列顺序消

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制