Android日志[进阶篇]一-使用 Logcat 写入和查看日志

Android日志[进阶篇]一-使用 Logcat 写入和查看日志
Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈)
Android日志[进阶篇]三-Logcat命令行工具
Android日志[进阶篇]四-获取错误报告
Android日志[进阶篇]五-阅读错误报告

目录

    • 查看应用日志
    • 写入日志消息
    • Logcat 消息格式
    • 设置日志级别
    • 搜索 logcat 消息
    • 过滤 logcat 消息
    • 读取垃圾回收消息
      • Dalvik 日志消息
      • ART 日志消息

Android Studio 中的 Logcat 窗口会显示系统消息,例如在进行垃圾回收时显示的消息,以及使用 Log类添加到应用的消息。此窗口可以实时显示消息,也可以保留历史记录,因此可以查看较早的消息。

要仅显示感兴趣的信息,可以创建过滤器、修改消息中显示的信息量、设置优先级、仅显示通过应用代码生成的消息以及搜索日志。默认情况下,logcat 仅显示与最近运行的应用相关的日志输出。

如果应用抛出异常,logcat 会显示一条消息,后跟相关联的堆栈轨迹,其中包含指向相应代码行的链接。

从 Android Studio 2.2 开始,Run 窗口还会显示当前正在运行的应用的日志消息。请注意,可以配置 logcat 输出显示,但无法配置 Run 窗口。

查看应用日志

如需显示应用的日志消息,请执行以下操作:

  1. 在设备上构建和运行应用。
  2. 依次点击 View > Tool Windows > Logcat(或点击工具窗口栏中的 Logcat 图标 )。

Logcat 窗口会显示所选应用(从窗口顶部的下拉列表中选择)的日志消息,如图 1 所示。

在这里插入图片描述

图 1. Logcat 窗口

默认情况下,Logcat 仅显示在设备上运行的应用的日志消息。要更改此默认设置,请参阅如何过滤 logcat 消息。

Logcat 工具栏中提供的按钮(如图1标号):

  1. Clear logcat :点击此按钮可以清除显示的日志。
  2. Scroll to the end :点击此按钮可以跳转到日志底部并查看最新的日志消息。如果先点击此按钮,然后点击日志中的某一行,则视图会在相应位置暂停滚动。
  3. Up the stack trace Down the stack trace :点击相应按钮可以在日志的堆栈轨迹中进行上下导航,从而选择输出的异常中显示的后续文件名(以及在编辑器中查看相应行号)。这与日志中点击某个文件名时的行为相同。
  4. Use soft wraps :点击此按钮可以启用换行并防止水平滚动(尽管所有非间断字符串仍然需要进行水平滚动)。
  5. Print :点击此按钮可以输出 logcat 消息。在显示的对话框中选择输出偏好设置后,还可以选择将其保存为 PDF 格式。
  6. Restart :点击此按钮可以清除日志并重启 logcat。与 Clear logcat 按钮不同,此按钮可以恢复并显示之前的日志消息,因此当 Logcat 无响应而又不想失去日志消息时,此按钮是最有用的。
  7. Logcat header :点击此按钮可以打开 Configure Logcat Header 对话框,在该对话框中,可以自定义各个 Logcat 消息的外观,例如是否显示日期和时间。
  8. Screen capture :点击此按钮可以截取屏幕截图。
  9. Screen record :点击此按钮可以录制设备屏幕的视频(时长不超过 3 分钟)。

写入日志消息

通过 Log 类,可以创建(输出)日志消息,这些消息会显示在 logcat 中。一般来说,使用以下日志方法,这些方法按照优先级从高到低(或者从最简略到最详细)的顺序列示:

  • Log.e(String, String)(错误)
  • Log.w(String, String)(警告)
  • Log.i(String, String)(信息)
  • Log.d(String, String)(调试)
  • Log.v(String, String)(详细)

有关更完整的选项列表,请参阅 Log 类说明。

除开发期间外,其他任何时候都绝不应将详细日志编译到您的应用中。虽然会编译调试日志,但会在运行时将其去掉,而错误、警告和信息日志会始终保留。

对于每种日志方法,第一个参数都应是唯一标记,第二个参数都应是消息。系统日志消息的标记是一个简短的字符串,指示消息所源自的系统组件(例如 ActivityManager)。标记可以是有用的任何字符串,例如当前类的名称。

一种比较好的做法是,在要用于第一个参数的类中声明 TAG 常量。例如,可以按如下方式创建一条信息日志消息:

private static final String TAG = "MyActivity";
...
Log.i(TAG, "MyClass.getView() — get item number " + position);

注意:长度超过 23 个字符的标记名称在 logcat 输出中会被截断。

Logcat 消息格式

每个 Android 日志消息都有一个与之相关联的标记和优先级。系统日志消息的标记是一个简短的字符串,指示消息所源自的系统组件(例如 ActivityManager)。用户定义的标记可以是任何字符串,例如当前类的名称(建议的标记)。可以在 Log 方法调用中定义它,例如:

Log.d(tag, message)

优先级低到高:

  • V:详细(优先级最低)
  • D:调试
  • I:信息
  • W:警告
  • E:错误
  • A:断言

日志消息的格式为:

date time PID-TID/package priority/tag: message

例如,下面的日志消息的优先级为 V,标记为 Eagle

12-10 13:02:50.071 1901-4229/com.eagle.app V/Eagle: Handling delegate intent.

PID 代表进程标识符,TID 则为线程标识符;如果仅有一个线程,两者可以相同。

设置日志级别

可以通过设置日志级别来控制 logcat 中显示的消息数量。可以显示所有消息,也可以仅显示指示最严重情况的消息。

请注意,无论日志级别设置如何,logcat 都会继续收集所有消息。此设置仅决定 logcat 显示什么。

在“Log level”菜单中,选择以下值之一:

  • Verbose:显示所有日志消息(默认值)。
  • Debug:显示仅在开发期间有用的调试日志消息,以及此列表中较低的消息级别。
  • Info:显示常规使用情况的预期日志消息,以及此列表中较低的消息级别。
  • Warn:显示尚不是错误的潜在问题,以及此列表中较低的消息级别。
  • Error:显示已经引发错误的问题,以及此列表中较低的消息级别。
  • Assert:显示开发者预计绝不会发生的问题。

搜索 logcat 消息

要搜索 logcat 中当前显示的消息,请执行以下操作:

  1. (可选)如果想要使用正则表达式搜索模式,请选择 Regex
  2. 在搜索框中输入字符序列。

    Logcat 输出会相应地显示更改。

  3. 按 Enter 键以在此会话期间将搜索字符串保存到菜单中。
  4. 要重复搜索,请从搜索菜单中选择。根据需要选择或取消选择 Regex(不建议使用此设置)。

过滤 logcat 消息

将日志输出减少至可管理水平的一种方法是,使用过滤器施加限制。

注意:过滤器会应用于 logcat 的全部历史记录,而不仅仅是 logcat 中当前显示的消息。确保适当地设置其他显示选项,以便能够看到想要检查的过滤器输出。

要定义并应用过滤器,请执行以下操作:

  1. 在过滤器菜单中,选择一个过滤选项:
    • Show only selected application:仅显示通过应用代码生成的消息(默认选项)。Logcat 使用正在运行的应用的 PID 来过滤日志消息。
    • No Filters:不应用过滤器。无论选择哪个进程,logcat 都会显示设备中的所有日志消息。
    • Edit Filter Configuration:创建或修改自定义过滤器。例如,创建一个过滤器,以同时查看两个应用中的日志消息。
    定义过滤器后,可以在菜单中选择它们。要从菜单中移除过滤器,删除即可。
  2. 如果选择了 Edit Filter Configuration,请创建或修改过滤器:
    1. 在“Create New Logcat Filter”对话框中指定过滤器参数:
      • Filter Name:输入要设定的过滤器的名称,或者从左侧窗格中进行选择以修改现有过滤器。名称只能包含小写字符、下划线和数字。
      • Log Tag:(可选)指定标记。如需了解详情,请参阅 Logcat 消息格式。
      • Log Message:(可选)指定日志消息文本。如需了解详情,请参阅 Logcat 消息格式。
      • Package Name:(可选)指定软件包名称。如需了解详情,请参阅 Logcat 消息格式。
      • PID:(可选)指定进程 ID。如需了解详情,请参阅 Logcat 消息格式>。
      • Log Level:(可选)选择日志级别。如需了解详情,请参阅设置日志级别。
      • Regex:选择此选项可以为相应参数使用正则表达式语法。
    2. 点击 +,将过滤器定义添加到左侧窗格中。

      要移除过滤器,请在左侧窗格中将其选中,然后点击 -

    3. 完成后,点击 OK

如果没有看到想要检查的日志消息,请尝试选择 No filters再clean一下日志, 并搜索特定日志消息。

读取垃圾回收消息

有时,发生垃圾回收事件时,相应消息会输出到 Logcat 中。

如需详细了解应用的内存,请使用内存性能分析器。

Dalvik 日志消息

在 Dalvik(而不是 ART)中,每个 GC 都会将以下信息输出到 logcat 中:

D/dalvikvm(PID): GC_Reason Amount_freed, Heap_stats, 
External_memory_stats, Pause_time

示例:

D/dalvikvm( 9050): GC_CONCURRENT freed 2049K, 65% free 3571K/9991K, 
external 4703K/5261K, paused 2ms+2ms
GC 原因
什么触发了 GC 以及是哪种回收。可能的原因包括:
GC_CONCURRENT
在app的堆开始占用内存时释放内存的并发 GC。
GC_FOR_MALLOC
堆已满而系统不得不停止应用并回收内存时,应用尝试分配内存而引起的 GC。
GC_HPROF_DUMP_HEAP
当请求创建 HPROF 文件来分析堆时发生的 GC。
GC_EXPLICIT
显式 GC,例如当调用 gc() 时(开发者应避免调用它,而应信任 GC 会根据需要运行)。
GC_EXTERNAL_ALLOC
这仅适用于 API 级别 10 及更低级别(更新的版本会在 Dalvik 堆中分配任何内存)。外部分配内存的 GC(例如存储在原生内存或 NIO 字节缓冲区中的像素数据)。
释放量
从此次 GC 中回收的内存量。
堆统计数据
堆的可用空间百分比与(活动对象数量)/(堆总大小)。
外部内存统计数据
API 级别 10 及更低级别的外部分配内存(已分配内存量)/(发生回收的限值)。
暂停时间
堆越大,暂停时间越长。并发暂停时间显示两个暂停:一个出现在回收开始时,另一个出现在回收快要完成时。

在此类日志消息积聚时,请注意堆统计数据(上面示例中的 3571K/9991K 值)的增大情况。如果此值继续增大,可能会出现内存泄露。

ART 日志消息

与 Dalvik 不同,ART 不会为未明确请求的 GC 记录消息。只有在系统认为 GC 速度较慢时才会输出 GC 消息。更确切地说,仅在 GC 暂停时间超过 5 毫秒或 GC 持续时间超过 100 毫秒时。如果应用未处于可察觉到暂停的状态(例如应用在后台运行时,这种情况下,用户无法察觉 GC 暂停),则其所有 GC 都不会被视为速度较慢。系统一直会记录显式 GC。

ART 会在其垃圾回收日志消息中包含以下信息:

I/art: GC_Reason GC_Name Objects_freed(Size_freed) AllocSpace 
Objects,Large_objects_freed(Large_object_size_freed) Heap_stats LOS objects, Pause_time(s)

示例:

I/art : Explicit concurrent mark sweep GC freed 104710(7MB) AllocSpace 
objects,21(416KB) LOS objects, 33% free, 25MB/38MB, paused 1.230ms total 67.216ms
GC 原因
什么触发了 GC 以及是哪种回收。可能的原因包括:
Concurrent
不会挂起应用线程的并发 GC。此 GC 在后台线程中运行,而且不会阻止分配。
Alloc
应用在堆已满时尝试分配内存而引起的 GC。在这种情况下,垃圾回收在分配线程中发生。
Explicit
由应用明确请求的垃圾回收,例如,通过调用 gc()gc()。与 Dalvik 一样,在 ART 中,最佳做法是信任 GC 并避免请求显式 GC(如果可能)。不建议请求显式 GC,因为它们会阻止分配线程并不必要地浪费 CPU 周期。此外,如果显式 GC 导致其他线程被抢占,则也可能会导致卡顿(应用出现卡顿、抖动或暂停)。
NativeAlloc
原生分配(例如位图或 RenderScript 分配对象)导致出现原生内存压力,进而引起的回收。
CollectorTransition
由堆转换引起的回收;这由在运行时变更 GC 策略引起(例如应用在可察觉到暂停的状态之间切换时)。回收器转换包括将所有对象从空闲列表空间复制到碰撞指针空间(反之亦然)。

回收器转换仅在以下情况下出现:在 Android 8.0 之前的低内存设备上,应用将进程状态从可察觉到暂停的状态(例如应用在前台运行时,这种情况下,用户可以察觉 GC 暂停)更改为察觉不到暂停的状态(反之亦然)。

HomogeneousSpaceCompact
同构空间压缩是空闲列表空间到空闲列表空间压缩,通常在应用进入到察觉不到暂停的进程状态时发生。这样做的主要原因是减少内存使用量并对堆进行碎片整理。
DisableMovingGc
这不是真正的 GC 原因,但请注意,由于在发生并发堆压缩时使用了 GetPrimitiveArrayCritical,回收遭到阻止。一般情况下,强烈建议不要使用 GetPrimitiveArrayCritical,因为它在移动回收器方面存在限制。
HeapTrim
这不是 GC 原因,但请注意,在堆修剪完成之前,回收会一直受到阻止。
GC 名称
ART 具有可以运行的多种不同的 GC。
Concurrent mark sweep (CMS)
整个堆回收器,会释放和回收除映像空间以外的所有其他空间。
Concurrent partial mark sweep
几乎整个堆回收器,会回收除映像空间和 Zygote 空间以外的所有其他空间。
Concurrent sticky mark sweep
分代回收器,只能释放自上次 GC 后分配的对象。此垃圾回收比完整或部分标记清除运行得更频繁,因为它更快速且暂停时间更短。
Marksweep + semispace
非并发、复制 GC,用于堆转换以及同构空间压缩(对堆进行碎片整理)。
释放的对象
此 GC 从非大型对象空间回收的对象数量。
释放的大小
此 GC 从非大型对象空间回收的字节数量。
释放的大型对象
此垃圾回收从大型对象空间回收的对象数量。
释放的大型对象大小
此垃圾回收从大型对象空间回收的字节数量。
堆统计数据
可用空间百分比与(活动对象数量)/(堆总大小)。
暂停时间
通常情况下,暂停时间与 GC 运行时修改的对象引用数量成正比。当前,ART CMS GC 仅在 GC 即将完成时暂停一次。 移动 GC 的暂停时间较长,会在 GC 的大部分时间持续。

如果在 logcat 中看到大量 GC,请注意堆统计数据(上面示例中的 25MB/38MB 值)的增大情况。如果此值继续增大,且始终没有变小的趋势,可能会出现内存泄漏。或者,如果看到原因为“Alloc”的 GC,则您已快要达到堆容量上限,并且很快会出现 OOM 异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/558227.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

哈希表数据结构_算法与数据结构-哈希表

前面我们已经讲到了数组和链表,数组能通过下标 O(1) 访问,但是删除一个中间元素却要移动其他元素,时间 O(n)。 循环双端链表倒是可以在知道一个节点的情况下迅速删除它,但是吧查找又成了 O(n)。难道就没有一种方法可以快速定位和删…

Android日志[进阶篇]四-获取错误报告

Android日志[进阶篇]一-使用 Logcat 写入和查看日志 Android日志[进阶篇]二-分析堆栈轨迹(调试和外部堆栈) Android日志[进阶篇]三-Logcat命令行工具 Android日志[进阶篇]四-获取错误报告 Android日志[进阶篇]五-阅读错误报告 目录前言从设备上获取错误报告从 Android 模拟器上…

下列哪个适合做链栈_朋友圈人格图鉴:三天可见 vs 全部可见,哪个更适合做恋人?...

你们的朋友圈里有没有这样几种人&#xff1f;<< 朋友圈大赏 >>你可能已经对这些朋友圈的风格习以为常&#xff0c;其实&#xff0c;每个人在朋友圈展示的语言、行为&#xff0c;可能默默揭示着一个人自己原本是怎样的人、想成为什么样的人&#xff0c;以及与他人的…

iatf16949内审员_申请IATF16949认证有什么要求

1、证件要求必须要提供三证合一的营业执照&#xff08;在有效期内&#xff09;&#xff0c;营业执照的范围必须与申请IATF16949认证范围一致。2、处于汽车供应链的证明因为IATF16949认证要求厂家必须是直接与生产汽车有关的&#xff0c;具有加工制造能力&#xff0c;并通过这种…

GenseeSDK DocView(OpenGL)引起的TextView显示黑块

现象 先上图&#xff1a; 正常的图&#xff1a; 来到这的大侠是否也出现了同样的问题。 操作与描述 退出直播播放器后&#xff0c;整个app界面所有的TextView(EditText/Button)都显示为黑块。 快速解决 退出直播或点播后不要调用DocView的closeDoc函数即可&#xff0c;当…

Android WebView https白屏、Http和Https混合问题、证书配置和使用

目录前言启用https后白屏&#xff08;证书错误&#xff09;修改处理WebView中Http和Https混合问题处理办法Webview的几种内容加载模式证书配置或处理https请求的证书okhttp进行请求&#xff1a;HttpsURLConnection忽略证书前言 原有项目中有部分界面是用webview展现的h5页面&am…

tensorrt轻松部署高性能dnn推理_基于TensorRT车辆实时推理优化

基于TensorRT车辆实时推理优化Optimizing NVIDIA TensorRT Conversion for Real-time Inference on Autonomous Vehicles自动驾驶系统使用各种神经网络模型&#xff0c;这些模型要求在GPU上进行极其精确和高效的计算。Zoox是一家全新开发robotaxis的初创公司&#xff0c;充分利…

手机上网流量统计_数据统计 | 上半年手机流量同比增110.2%,你贡献了多少?

来源&#xff1a;工信部网站、中新经纬版权申明&#xff1a;内容来源网络&#xff0c;版权归原创者所有。除非无法确认&#xff0c;我们都会标明作者及出处&#xff0c;如有侵权烦请告知我们&#xff0c;我们会立即删除并表示歉意。谢谢&#xff01;7月25日&#xff0c;工信部网…

mybatis insert插入成功返回0_mybatis添加客户

在MyBatis的映射文件中&#xff0c;添加操作是通过元素来实现的。例如&#xff0c;向数据库中的t_customer表中插入一条数据可以通过如下配置来实现。在上述配置代码中&#xff0c;传入的参数是一个Customer类型&#xff0c;该类型的参数对象被传递到语句中时&#xff0c;#{use…

Andoid TextView显示富文本html内容及问题处理

目录富文本内容与效果TextView HtmlImageGetter 处理图片(表情)TagHandler 处理html内容的节点Html的转换过程HtmlToSpannedConverterhandleStartTagstartCssStyle(mSpannableStringBuilder, attributes)字体无效果实现getForegroundColorPattern颜色不显示的坑处理办法颜色修…

Java错误:找不到或无法加载主类

目录前言javac xxx.java 编译需要相对物理路径java xxx 执行需要虚拟路径总结前言 一般情况下&#xff0c;我们都使用工具进行代码的编辑和调试&#xff0c;例如eclipse 、Manven、Android Studio、sublime、vim、notepad、记事本等。 当我们用eclipse android studio等创建的p…

步苹果iOS的后尘,谷歌Android12“翻车”,更新需谨慎?

苹果不论电脑还是移动设备&#xff0c;都是一如既往的“强硬”。说实话&#xff0c;忽视“兼容”&#xff0c;体验极低。 有小伙伴调侃&#xff1a;人家就是要你买新机器。也有小伙伴&#xff08;包括我在内&#xff09;&#xff0c;直接关闭系统自动更新。 开发者&#xff1a…

Android Studio无线连接设备调试,比数据线更方便

前言 一般情况下&#xff0c;多数移动开发者使用的是数据线连接电脑&#xff0c;进行各种移动设备的调试&#xff0c;更有胜者&#xff0c;非常迷恋模拟器&#xff0c;模拟器它好不好&#xff0c;答案是好&#xff0c;因为直接运行在电脑上&#xff0c;直接操作&#xff0c;调试…

GenseeSDK 使用Kotlin要注意TODOAndroid Studio关闭TODO

目录一、Kotlin的TODO二、GenseeSDK与TODO 请注意三、Android studio关闭TODO一、Kotlin的TODO 在实现一些接口时候&#xff0c;工具自动将所有的接口函数"空"实现&#xff0c;并在函数体中增加一行代码&#xff1a; TODO或TODO(“not implemented”) 作为提醒催促…

OpenCV Mat基础认知感

OpenCV是一个开源的供开发的计算机视觉处理库&#xff0c;涵盖的内容包括图像处理&#xff0c;机器学习。由c到c &#xff0c;再到各平台的跨平台框架。 Mat - 图像容器 Mat类用于表示一个多维的单通道或者多通道的稠密数组。能够用来保存实数或复数的向量、矩阵&#xff0c;…

C++期末实践程序设计与数组作为参数的注意事项

目录小表弟发来的求助信号要点代码文件头文件Student.h源文件Student.cppmain.c执行结果c数组特性以及数组做形参的特点数组试验数组特殊性质不允许拷贝和赋值数组是通常被转化成指针使用数组形参多种写法代理模式MVC模式小表弟发来的求助信号 并补充说要5种写法才算过关。 要…

windows 7远程桌面和被远程连接电脑启动远程桌面服务

目录远程桌面连接开启远程桌面服务&#xff08;被连电脑&#xff09;配置启动远程桌面服务远程桌面连接 这部分主要讲解如何通过一台windows 电脑的远程桌面程序连接"远程"电脑桌面。前提是被连的那台电脑已开启远程桌面服务。远程桌面服务开启之后&#xff0c;可以…

表单和字都居中_APP 分享 | 6 款黑科技工具,低调收藏,每一款都很强大!

iSlide 简单、高效地制作PPT使用环境: Windows使用要求: Office 2010 及以上版本授权状况: 无广告 有付费功能官网地址: www.islide.ccSlide是一款基于PowerPoint的插件工具,功能十分强大,高效做PPT必备利器一键优化:将PPT中不规则的字体,段落,色彩,参考线…

Android studio gradle task list 不显示问题

问题描述 新电脑安装android studio后&#xff0c;导入工程&#xff0c;各种配置都弄好变更好&#xff0c;出现了如下情况&#xff1a; 之前习惯的gradle task 不在列表中&#xff0c;好不习惯。 正常期望如下&#xff1a; 处理方法 快捷键Ctrl Alt S或者 file -> se…

Android Studio Gradle输出信息乱码

在更换android studio 版本之后&#xff0c;一般windows 版本在项目构建过程中&#xff0c;gradle 相关的信息输出&#xff0c;会出现乱码&#xff0c;基本上明知是字符编码的问题&#xff0c;但看着就是不爽&#xff0c;例如下面这的情形&#xff1a; ע: ijЩ&#xfffd;&am…