当前位置:   article > 正文

Android ANR log trace日志文件分析

android anr log
  • 什么是ANR?

    ANR:Application Not Responding,即应用无响应

  • ANR日志Trace文件获取

    系统生成的Trace文件保存在data/anr,可以用过命令adb pull data/anr/取出

    traces.txt只保留最后一次ANR的信息,Android系统有个DropBox功能功能,它能记录系统出现的crash错误.因此保留有发生过的ANR的信息.(log路径:/data/system/dropbox)

    获取系统crash log: adb shell dumpsys dropbox --print >>log.txt

  1. Trace文件怎么生成的?
  2. APP(包括系统APP和用户APP)进程出现ANR、应用响应慢或WatchDog的监视没有得到回馈时,
  3. 系统会dump此时的top进程,进程中Thread的运行状态就都dump到这个Trace文件中了.
  • 导致ANR的常见几种情况:

    1:Input dispatching timed out(5 seconds) 按键或触摸事件处理超时(一般是UI主线程做了耗时的操作,这类ANR最常见)

    2:BroadcastTimeout(10 seconds) 广播的分发和处理超时(一般是onReceiver执行时间过长)

    3:ServiceTimeout(20 seconds) Service的启动和执行超时

    另外还有ProviderTimeout和WatchDog等导致的ANR.还有当系统内存或CPU资源不足时容易出现ANR,一般这种情况会有lowmemorykill的log打印.

    应用ANR产生的时候,ActivityManagerService的appNotResponding方法就会被调用,然后在/data/anr/traces.txt文件中写入ANR相关信息.

  1. final void appNotResponding(ProcessRecord app, ActivityRecord activity,
  2. ActivityRecord parent, boolean aboveSystem, final String annotation) {
  3. // ... ...
  4. if (MONITOR_CPU_USAGE) {
  5. updateCpuStatsNow(); // 更新CPU使用率
  6. }
  7. // ... ...
  8. final ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true);
  9. // dumpStackTraces是输出traces文件的函数
  10. File tracesFile = dumpStackTraces(true, firstPids, processCpuTracker, lastPids,
  11. NATIVE_STACKS_OF_INTEREST);
  12. String cpuInfo = null;
  13. if (MONITOR_CPU_USAGE) {
  14. updateCpuStatsNow(); // 再次更新CPU信息
  15. synchronized (mProcessCpuTracker) {
  16. // 输出ANR发生前一段时间内的CPU使用率
  17. cpuInfo = mProcessCpuTracker.printCurrentState(anrTime);
  18. }
  19. info.append(processCpuTracker.printCurrentLoad());
  20. info.append(cpuInfo);
  21. }
  22. // 输出ANR发生后一段时间内的CPU使用率
  23. info.append(processCpuTracker.printCurrentState(anrTime));
  24. Slog.e(TAG, info.toString());
  25. if (tracesFile == null) {
  26. // There is no trace file, so dump (only) the alleged culprit's threads to the log
  27. Process.sendSignal(app.pid, Process.SIGNAL_QUIT);
  28. }
  29. // 将ANR信息同时输出到DropBox中
  30. addErrorToDropBox("anr", app, app.processName, activity, parent, annotation,
  31. cpuInfo, tracesFile, null);
  32. // ... ...
  33. synchronized (this) {
  34. // 显示ANR提示对话框
  35. // Bring up the infamous App Not Responding dialog
  36. Message msg = Message.obtain();
  37. HashMap<String, Object> map = new HashMap<String, Object>();
  38. msg.what = SHOW_NOT_RESPONDING_MSG;
  39. msg.obj = map;
  40. msg.arg1 = aboveSystem ? 1 : 0;
  41. map.put("app", app);
  42. if (activi
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Li_阴宅/article/detail/812785
推荐阅读
相关标签
  

闽ICP备14008679号