技术标签: trace anr logcat android Android 应用层开发
在开发中,遇到anr 的原因会有:
System Server
中WatchDog出现ANR;service binder
的连接达到上线无法和和System Server通信当发生Anr时,系统会记录以下信息:
接下来,通过一个输入事件没有响应的案例来,借用loagcat和trace 文件 分析。
通过Studio编写以下代码:(来源网络)
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private TextView testText;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
Log.d(TAG, "onCreate start");
}
@Override
protected void onPause() {
super.onPause();
try {
Log.d(TAG, "onPause 准备sleep9秒");
Thread.sleep(9000);
Log.d(TAG, "onPause sleep9秒完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop start");
try {
Log.d(TAG, "onStop 准备sleep9秒");
Thread.sleep(9000);
Log.d(TAG, "onStop sleep9秒完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void initView() {
Button btnTest = findViewById(R.id.btn_test);
testText = findViewById(R.id.tv_test);
btnTest.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
testSleep();
}
});
}
public void testSleep() {
//10s之后本应该进行更新ui操作,但是由于此时主线程处于休眠状态,因此待主线程结束休眠之后才会进行更新ui操作
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.d(TAG, "准备更新text");
testText.setText("update btn text");
Log.d(TAG, "更新text完成");
}
}, 10000);
try {
Log.d(TAG, "准备sleep30秒");
Thread.sleep(30000);
Log.d(TAG, "sleep30秒完成");
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.d(TAG, "first update");
testText.setText("This is the first update");
}
}
点击按钮,滑动屏幕或者点击Back键,等待几秒则会出现anr的弹窗。
当app运行程序的时候,开启命令行。
首先,在打开命令行(未配置adb全路径,请在sdk中打开命令行) 下执行:
adb logcat -b all -v time >.\anr_test.log
,如下图所示:
解释:
发生anr 后,执行Ctrl+c 操作,结束日志抓取。
最终,日志会存储在执行cmd 命令所在目录下的anr_test.log文件中,如下图所示:
接下来,通过编辑器打开anr_test.log日志,寻找logcat的anr事件。
在anr_test.log中检索event log和 system log 事件:
通过event log 检索 am_anr
:
11-02 11:32:16.915 I/am_anr ( 1753): [0,23694,com.miniwan.test.myapplication,820559686,Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 22. Wait queue head age: 5729.4ms.)]
am_anr 的结构格式:[User ,pid ,Package Name,Flags ,reason] 。更多event log的资料,请阅读Android EventLog。
从上可知:
11-02 11:32:16
:是anr发生时间通过system log , 继续检索ANR in
关键字,能找到进一步更详细的信息:
11-02 11:32:29.407 E/ActivityManager( 1753): ANR in com.miniwan.test.myapplication (com.miniwan.test.myapplication/.MainActivity)
11-02 11:32:29.407 E/ActivityManager( 1753): PID: 23694 //进程id
11-02 11:32:29.407 E/ActivityManager( 1753): Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago. Wait queue length: 22. Wait queue head age: 5729.4ms.) //发生anr的原因,这里是输入事件没有响应
11-02 11:32:29.407 E/ActivityManager( 1753): Parent: com.miniwan.test.myapplication/.MainActivity
11-02 11:32:29.407 E/ActivityManager( 1753): Load: 0.0 / 0.0 / 0.0 //Load表明是1分钟,5分钟,15分钟CPU的负载
11-02 11:32:29.407 E/ActivityManager( 1753): CPU usage from 0ms to 12458ms later (2021-11-02 11:32:16.860 to 2021-11-02 11:32:29.318): // ANR后CPU的使用情况 ======later是标志
11-02 11:32:29.407 E/ActivityManager( 1753): 0.6% 1366/media.codec: 0.4% user + 0.2% kernel / faults: 62207 minor 60 major
11-02 11:32:29.407 E/ActivityManager( 1753): 0.9% 23694/com.miniwan.test.myapplication: 0.5% user + 0.4% kernel / faults: 2693 minor 5 major // 当前进程的cpu 使用情况
//......省略部分日志
11-02 11:32:29.407 E/ActivityManager( 1753): 0.1% 12039/kworker/u17:0-dwc_wq
11-02 11:32:29.407 V/java.lang.ASSERT( 1753): copyAnr filePath = /data/anr/anr_2021-11-02-11-32-17-657 //
从上可知:
进程Id为23694且包名为com.miniwan.test.myapplication 的程序发生Anr ,是因为输入事件没有响应导致的。
Wait queue length: 22是指前面还有 22个事件等待处理。
Load: 0.0 / 0.0 / 0.0 //是指 在 1分钟,5分钟,15分钟CPU的负载。
从上面数据看没有IO wait 或者cpu使用不合理的地方。
当找到anr 发生原因,后需要借助trace.txt 进一步分析。
打开cmd命令行,输入adb bugreport
执行。会在命令所在的目录,生成对应的压缩文件。
若是没有生成,则在android studio的Device File Explorer的bugreports目录下看到,再拷贝出来。
根据anr发生的时间点找到对应的bugreport压缩文件。
在bugreport压缩包中,bugreport_xxxx.txt也是可以查看到记录的logcat 事件,和执行adb logcat -b all -v time >.\anr_test.log
类似,如下图所示:
解压后,在FS/data/anr下找到对应事件的trace日志,如下图所示:
通过编辑器,打开该trace文件,根据进程id(23694)和发生时间点(11-02 11:32:16)找到相应的信息:
----- pid 23694 at 2021-11-02 11:32:17 -----
Cmd line: com.miniwan.test.myapplication //程序的包名
Build fingerprint: 'OPPO/PCLM50/OP4AB5:10/QKQ1.200216.002/1609877348:user/release-keys'
ABI: 'arm64'
Build type: optimized
Zygote loaded classes=9847 post zygote classes=539
//.....省略部分日志
"main" prio=5 tid=1 Sleeping //这里主线程是tid唯一标识为1, sleep是沉睡状态
| group="main" sCount=1 dsCount=0 flags=1 obj=0x71925cf0 self=0x7dc7a10800
| sysTid=23694 nice=-10 cgrp=default sched=0/0 handle=0x7e4decaed8 //主线程的id是和主进程的id一致
| state=S schedstat=( 377724687 71579581 186 ) utm=31 stm=6 core=7 HZ=100
| stack=0x7fc5112000-0x7fc5114000 stackSize=8192KB
| held mutexes=
at java.lang.Thread.sleep(Native method)
- sleeping on <0x02cd17eb> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:440)
- locked <0x02cd17eb> (a java.lang.Object) //持有0x02cd17eb这个锁,在沉睡
at java.lang.Thread.sleep(Thread.java:356)
at com.miniwan.test.myapplication.MainActivity.testSleep(MainActivity.java:79)
at com.miniwan.test.myapplication.MainActivity$1.onClick(MainActivity.java:58)
at android.view.View.performClick(View.java:7377)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
at android.view.View.performClickInternal(View.java:7339)
at android.view.View.access$3900(View.java:823)
at android.view.View$PerformClick.run(View.java:28258)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:238)
at android.app.ActivityThread.main(ActivityThread.java:7890)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:983)
根据以上代码走向,最后锁定在MainActivity#testSleep()方法中,持有了锁在沉睡,导致主进程在沉睡。当用户点击back键,系统进程am 通过binder 通信到主进程中,但间隔5秒都没有收到回执,系统进程抛出anr。
归纳总结:
参考:
MATLAB中所有数据类型的所有变量都是多维数组。向量是一维数组,矩阵是二维数组。我们前面已经讨论和学习过向量和矩阵。 在本章中,将讨论和学习多维数组。 然而,在此之前,让我们先学习一些特殊类型的数组。MATLAB中的特殊数组在本节中,我们将讨论学习一些创建一些特殊数组的函数。对于这些函数,单个参数创建一个正方形数组,双参数创建矩形数组。zeros()函数是用来创建一个全零的数组 -例如 -zer...
https://blog.csdn.net/john_chang11/article/details/52806178?utm_medium=distribute.pc_relevant.none-task-blog-baidujs-1https://zjxkenshine.github.io/2018/04/13/Redis%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%EF%BC%88%E4%BA%94%EF%BC%89%EF%BC%9A%E6%8C%81%E4%B9.
1. 操作示例@Query(value = "SELECT u.serviceId FROM AlgrthmServiceMap u WHERE u.algrthmType=:algrthmType")String findServiceId(@Param("algrthmType") String algrthmType);/*** 查询全部*/@Query("select...
在我们能够迁移到IPv6之前,IPv4地址肯定就耗光了,因此我们必须渡过一段时间,不仅有IPv4与IPv6共存,而且是IPv4地址共享的时代。 IPv4地址共享技术大致有两类。一种是运营商运营NAT,给用户分配的是RFC1918的地址;另外一种是为用户分配公开IPv4地址,通过划分不同的port区间共享。前一种技术的典型代表是Carrier Grade NAT (CGN), 也
我不是领导,如何让别人听我的话
spark命令总结:yarn application -list : 列出所有正在执行的任务。spark-submit 提交任务任务。以及各参数的含义。spark-submit \–master yarn \–jars required_jars/spark-streaming-kafka-0-8-assembly_2.11-2.4.3.jar \–deploy-mode cluster \–num-executors 1 \–executor-memory 1G \–driver-m
双绞线的制作和直联线交叉线区别 双绞线有两种接法标准:EIA/TIA 568B标准和EIA/TIA 568A标准。 T568A线序 1 2 3 4 5 6 7 8 绿白 绿 橙白 蓝 蓝白 橙 棕白 棕
docker 卸载使用yum安装docker(安装过程可以参照linux 安装docker),如需卸载docker可以按一下步骤操作:1、查看当前docker状态如果是运行状态则停掉systemctl stop docker2、查看yum安装的docker文件包 yum list installed |grep docker查看docker相关的rpm源文件rpm -qa |grep docker3、删除所有安装的docker文件包yum -y
前端小小白一枚,一直羡慕前端大神分分钟写出来一个模态层图片预览,这两天项目不吃紧,自己动手试做一个既然是自己动手,虽然功能比不上大神的,不过兼容性调到了ie8,还是小有成就的,现分享出来给其他小白参考,路过的大神有更牛掰的代码,欢迎评论分享工具:hbuilder遇到的兼容性问题:ie8不支持 addEventLisenter,要判断,改用 attachEvent ie8不支持通过...
安装:npm install axios --savemain.js 入口文件中全局挂载(这里使用原型链挂载):import axios from 'axios';Vue.prototype.$http = axios;config文件夹下的index.js 配置服务器环境module.exports = { dev: {//开发服务器 // Paths assetsSubDirectory: 'static', assetsPublicPath: '/',
整理自百度百科T检验,亦称student t检验(Student's t test),主要用于样本含量较小(例如n &lt; 30),总体标准差σ未知的正态分布。T检验是用t分布理论来推论差异发生的概率,从而比较两个平均数的差异是否显著。它与f检验、卡方检验并列。t检验是戈斯特为了观测酿酒质量而发明的,并于1908年在Biometrika上公布。 适用条件 (1) 已知一个总体均数...
本周阅读了《我是一只IT小小鸟》的第二部分,即居振梁的自述,这一部分与上一部分不同,我与这位前辈的共鸣不强,对其观点的反对之处却有一些。 先说我认同的观点吧。 首先,关于“课内”与“课外”,确实,现在的某些必修课程对于IT工程师或是科学家来说,可能一辈子都不会用到(比如原子物理),但是这些必修课程是计入个人成绩的,它们也许不会影响你的软工水平,但是会影响...