当前位置:   article > 正文

Android Logcat不能正常打印日志或显示No debuggable processes(Android Studio没有可调试应用)问题解决方案(打印,Log,2021)_see dmesg for error reason.

see dmesg for error reason.

1 问题背景

博主在使用多次Android Studio后,总会出现一个问题:在Android Studio中不停重新构建项目代码并运行APP,Logcat中始终没法发现可调试的APP或者不能正常打印日志。而这会导致在APP开发时无法实时查看Logcat,从而定位APP开发过程中的问题,其中No debuggable processes的问题体现截图如下:
在这里插入图片描述
又或者,虽然Logcat中能识别到可调试的APP,但是我们在测试这个APP时,明知测试过程中会生成大量的日志信息,但是Logcat中并未生成任何日志信息,该问题截图如下:
在这里插入图片描述

2 问题的原因

出现这个问题主要有两个原因:

  1. AndroidAndroid Studio的Logcat工具的环形缓冲区空间过小,默认为1024KB,因此输出10000行左右的日志就会开始删除老的日志信息了。如果你正在调试一款工程量极其庞大的Android项目,又或者你没对Logcat指定“仅打印选中的进程生成的日志”等过滤条件,那么你的Logcat输出窗口会在几秒内输出的日志就达到10000行左右的阈值了,如果输出的日志超多超快就会导致logcat: Unexpected EOF!的问题,因此我们应该扩大Logcat工具的环形缓冲区空间大小;
  2. 安卓测试设备的Log日志环形缓冲区过小,默认为64KB,因此会导致安卓测试设备不能够存储更久远的日志信息以供Logcat命令查询历史,这不是我们希望看到的,因此我们也应该扩大安卓测试设备的Log日志环形缓冲区的大小。

有时你能看到Logcat生成下述的错误信息:

logcat: Unexpected EOF!
This means that either the device shut down, logd crashed, or this instance of logcat was unable to read log messages as quickly as they were being produced.
If you have enabled significant logging, look into using the -G option to increase log buffer sizes.


logcat:异常的EOF(文件读写到结尾)!
这意味着要么是设备断开了与电脑的连接,要么是Logd崩溃了,要么是这个Logcat实例无法及时读取过快过多生成的日志消息。
如果您已经启用了重要的日志记录功能,请考虑使用-G选项来增加日志缓冲区的大小。

对于此问题有点类似消费者/生产者模型,输出的日志有点像生产者由于没有节制没有规划,导致量大于求,生产过多导致仓库爆单,工厂生产无法正常进行了。而这里的日志缓冲区就是消费者,由于消费者数量有限无法完全消费完生产者生产的产品从而导致整套模型无法正常地运作了。此时就需要扩大内需将消费者扩大。

3 配置Android Studio的Logcat工具的环形缓冲区的大小

3.1 在Android Studio的偏好设置中配置Logcat环形缓冲区的大小

当我们调试的APP生成的日志过多,或者我们没有对Logcat指定“仅打印选中的进程生成的日志”等过滤条件,那么Logcat会在几秒内打印大量的日志,你甚至会发现当打印的日志到达一定上限时,新打印的日志在生成的同时,最老的日志会依次被删除掉。你可以将Logcat的滑动条拖到最底部并点击Logcat任意一行日志来验证这个问题,你会发现下述截图中蓝色框框中显示的数字分别是光标所在日志的第9976行的第1列,接着你仔细观察这个行数,如果这个行数一直在变大则说明目前生成的日志信息没有达到阈值,如果这个行数开始变小则说明目前生成的日志信息达到阈值了,因为存储不完这么多日志信息,Logcat开始从老到新的时间顺序来删除老的日志,以腾出空间给新的日志:
在这里插入图片描述
你可以在Android Studio-Preferences-Editor-General-Console中看到Override console cycle buffer size(1024kb)这个勾选框,如果你从来没有修改过这个属性的值,那么就说明你的Android Studio的Logcat的环形缓冲区大小为默认的1024KB,如上述截图所示,大小为1024KB的环形缓冲区的Logcat最多能缓存和显示10000行左右的日志信息,如果新生成的日志超过了这个数量,Logcat会从老到新的时间顺序来删除老的日志。
在这里插入图片描述

因此我们可以为Logcat环形缓冲区配置更大的空间,例如博主为环形缓冲区分配了999999KB的空间,当然分配更大的空间可能导致Android Studio的性能下降,因此大家自行斟酌:
在这里插入图片描述
在修改完上述的Logcat环形缓冲区的大小后,我们必须彻底重启Android Studio,因为Logcat环形缓冲区的大小的数值是在Android Studio启动时配置的,不支持运行时热修改,因此我们要彻底重启Android Studio让该配置生效。接着我们可以看到,重启后的Android Studio能显示超多行数的Logcat日志,例如下述截图中Logcat能展示323442行日志,这便是我们预期的效果:
在这里插入图片描述

3.2 避坑无效的Logcat环形缓冲区配置方法

其中咱们还能参考到其他相关的文章,例如《修改 Android Studio 的 Logcat 缓冲区大小》文章会告知我们可以修改Android Studio的安装目录\bin\idea.properties文件idea.cycle.buffer.size属性的数值来配置缓冲区的大小:
在这里插入图片描述
博主用的Android Studio的版本号为Android Studio Arctic Fox | 2020.3.1 Patch 2,用该版本的Android Studio自测这个idea.cycle.buffer.size属性,无论数值改大改小,即使重启Android Studio,idea.cycle.buffer.size属性配置的数值都无法生效,因此我建议你直接通过配置Android Studio的Override console cycle buffer size(1024kb)属性来指定Logcat环形缓冲区的大小。

4 查询和配置安卓测试设备的Log日志环形缓冲区的大小

4.1 查询安卓测试设备的Log日志环形缓冲区的大小

有什么方法能查询我们安卓测试设备的Log日志环形缓冲区的大小呢?目前有下述两种方法:

4.1.1 开发者模式

首先,我们可以在安卓测试设备的开发者模式中查询和配置其的Log日志环形缓冲区的大小:
在这里插入图片描述
果不其然,在上述截图中我们可以发现,没有显式配置过Log日志环形缓冲区大小的测试机的默认大小为64KB,正是这个问题导致安卓测试设备不能够存储更久远的日志信息。

4.1.2 adb logcat -g命令

其次,我们可以用adb logcat -g命令查询当前安卓测试设备的Log日志环形缓冲区的大小:

bogon:test-android-app lijunde$ adb logcat -g
main: ring buffer is 64 KiB (60 KiB consumed), max entry is 5120 B, max payload is 4068 B
system: ring buffer is 64 KiB (61 KiB consumed), max entry is 5120 B, max payload is 4068 B
crash: ring buffer is 64 KiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
kernel: ring buffer is 64 KiB (0 B consumed), max entry is 5120 B, max payload is 4068 B
  • 1
  • 2
  • 3
  • 4
  • 5

通过上述输出的信息,我们了解到这部安卓测试设备的main、system、crash和kernel环形缓冲区的大小都是64KB,这辅证了我们在开发者模式中查询测试机的Log日志环形缓冲区大小。其中,关于main、system、crash和kernel环形缓冲区的含义和区别可参考文章《Android10.0 日志系统分析(一)-logd、logcat 指令说明、分类和属性-[Android取经之路]》。

4.2 配置安卓测试设备的Log日志环形缓冲区的大小

4.2.1 配置安卓测试设备的Log日志环形缓冲区的大小

要解决这个问题,我们需要配置更大空间的Log日志环形缓冲区。

4.2.1.1 在开发者模式中配置安卓测试设备的Log日志环形缓冲区的大小

其中最简单的解决方案便是在开发者模式中配置安卓测试设备的Log日志环形缓冲区的大小:
在这里插入图片描述

4.2.1.2 在开发者模式中配置安卓测试设备的Log日志环形缓冲区的大小

其次也可以通过shell命令setprop ro.logd.size 16M来配置测试机的Log日志环形缓冲区的大小,但这种方案需要你的测试机已经解锁BootLoader并Root,否则执行上述命令是被告知命令执行失败的:

bogon:test-android-app lijunde$ adb shell
o1q:/ $ setprop ro.logd.size 16M
Failed to set property 'ro.logd.size' to '16M'.
See dmesg for error reason.
  • 1
  • 2
  • 3
  • 4

4.2.2 验证是否能正常查看Logcat日志

接着在Terminal中运行adb kill-server命令杀死ADB进程,这个命令间接等价于重启Logcat:
在这里插入图片描述
接着就能正常地选择可调试的应用并显示该应用所有的Log日志了:
在这里插入图片描述

5 如何查询启动就Crash崩溃的APP的日志信息

在Logcat中取消指定“仅打印选中的进程生成的日志”等过滤条件,即查询该安卓设备所有APP的日志信息,再在这些日志中搜索关键词FATAL即可查询崩溃日志的代码调用栈了,其中也可搜索要查询日志的APP的包名来定位该APP相关的日志。

6 在未过滤日志中如何查询特定APP或只查询崩溃信息

在这些日志中搜索关键词FATAL即可查询崩溃日志的代码调用栈了,其中也可搜索要查询日志的APP的包名来定位该APP相关的日志。

7 如何查询安卓设备历史的日志

在Android Studio的终端中执行下述命令:

#命令Android Studio的Logcat工具开始监听当前设备的日志,并同步日志到指定路径下的文件中
adb logcat > ~/Downloads/logs.txt
#命令Android Studio的Logcat工具停止监听当前设备的日志
同时按住Mac电脑的Control键和C键终止Logcat继续同步日志
  • 1
  • 2
  • 3
  • 4

8 查询某个特定时间段的安卓设备的日志

在Android Studio的终端中执行下述命令:

#清除当前设备存储的所有历史日志
adb logcat -c
#命令Android Studio的Logcat工具开始监听当前设备的日志,并同步日志到指定路径下的文件中
adb logcat > ~/Downloads/logs.txt
#命令Android Studio的Logcat工具停止监听当前设备的日志
同时按住Mac电脑的Control键和C键终止Logcat继续同步日志
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

本文参考文献:
[1]Can’t attach Android Studio’s debugger to Android process

[2]解决Android logcat: Unexpected EOF!方法指南

[3]简书-Android Studio 修改logcat缓存大小

[4]修改 Android Studio 的 Logcat 缓冲区大小

[5]使用adb logcat命令显示Android设备上的Log日志

[6]adb logcat 命令详解 log过滤

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/307466?site
推荐阅读
相关标签
  

闽ICP备14008679号