当前位置:网站首页 > Java教程 > 正文

java制作logcat教程



在Android开发中,无论是app还是system的开发,logcat都是debug所必须的。本文整理了一下logcat的日常用法和最常用的Debug技巧。本文的目的不在于大而全,定位差不多是一个快速使用手册。

常用adb命令

执行完logcat之后,输出往往是一大坨,眼花缭乱的,新手可能看不懂:

其实知道logcat输出的格式之后,就可以很简单的读懂了:

以上输出的信息包含了如下格式的内容:

  • PID: Process ID, 即进程id, 可以看成app运行时,在系统中的唯一的一个标识
  • TID: Thread ID, 即线程ID, 因为一个进程可以包含多个线程,而同一个进程内的各个线程是资源共享的,所以TID也比较重要
  • Log级别: 常用的5个分别是 V(Verbose 明细,最低级别)、D(Debug 调试)、I(Info 信息)、W(Warn 警告)、E(Error 错误)
  • TAG:开发中,标记Log的一个标志。Developer添加Log的时候,其实写什么样的TAG都可以,主要是为了通过这个TAG告诉自己大概发生了什么。比如,如果TAG使用类名,就可以知道输出LOG是哪个类。你也可以写任意其他的,比如写自己的名字,表示是自己刚刚添加的Log。这里一般都是类名或者app的名字。
  • Log内容:记载Log的具体内容,输出的内容是什么是由代码里对应的Log语句决定的。eg:

以如下log为例:

就可以这样去解读:

kernel 顾名思义就是内核,在系统开发中会涉及到内核的bug,此时需要调取kernel log。kernel的log不是由logcat去抓,logcat只能抓取user space的log。可以用如下命令抓取kernel log:

我们学习的logcat就是抓user space bug的。我的习惯是直接导出所有的log,但看了网上的资料,也有很多人根据不同日志的分类去导出log,提高debug效率

这个分类的日志主要适用于RIL(Radio Interface Layer)开发的人员,比如日常生活最重要的移动数据上网、通话、短信等均属于 radio 的研发。抓取 radio 日志的方法为:

event 的日志包含了对于手机基本操作的记录,如打开/关闭一个软件、按下返回键、打开/关闭通知栏等等,抓取方法:

main 日志是开发软件中最常用到的日志了,在这里你可以看到应用崩溃的具体原因、调试的时候通过  所打印出来的日志,抓取方法:

简要说明:

方法一:
下在介绍一个简单的调试库的方法,当然需要有so库的源代码
举例
a) 错误信息如下,它表示了出错时的函数调用关系(下面调上面的)


I/DEBUG ( 634): #00 pc 000078e6 /system/lib/libmultiplayerservice.so
I/DEBUG ( 634): #01 pc 000087bc /system/lib/libmultiplayerservice.so
I/DEBUG ( 634): #02 pc 0000e94e /system/lib/libsensorservice.so
I/DEBUG ( 634): #03 pc 0000a790 /system/lib/libsensorservice.so
I/DEBUG ( 634): #04 pc 0000d4b2 /system/lib/libsensorservice.so
I/DEBUG ( 634): #05 pc 0000d852 /system/lib/libsensorservice.so
I/DEBUG ( 634): #06 pc 00015ece /system/lib/libutils.so
I/DEBUG ( 634): #07 pc 0000153a /system/lib/libsystem_server.so
I/DEBUG ( 634): #08 pc 00001756 /system/lib/libsystem_server.so
I/DEBUG ( 634): #09 pc 0000adb8 /system/lib/libandroid_servers.so
I/DEBUG ( 634): #10 pc 00011cb4 /system/lib/libdvm.so


b)进入源码中带符号表的so库所在目录
$ cd out/target/product/generic/obj/SHARED_LIBRARIES/libmultiplayerservice_intermediates/LINKED

这个有个需要注意的地方:

对于可执行程序及动态库,一般在LINKED子目录中是带有符号的库(没有经过符号剥离),如果可执行文件中没有包括调试符号,您将获得??:0 作为响应。


c)用addr2line命令找到地址对应的程序位置,动态库为libmultiplayerservice.so
arm-eabi-addr2line 000078e6 -e libmultiplayerservice.so
结果:,显示出对应的程序文件和行数,如果不是debug版本,可能有一两行偏差
frameworks/base/services/multiplayerservice/PlayerSocket.cpp 421 行

d)注意
arm-eabi_addr2line在prebuild/linux-x86/toolchain/arm-eabi-xxx/bin目录下,
运行build/envsetup.sh后即可直接使用它,同目录下的objdump, nm也是常用调试命令

1、首先需要一个重要的脚本文件:

将以上文件保存hy.panic.py

2、相关的死机堆栈信息保存 error.txt

例如:

I/DEBUG ( 634): #00 pc 000078e6 /system/lib/libmultiplayerservice.so
I/DEBUG ( 634): #01 pc 000087bc /system/lib/libmultiplayerservice.so
I/DEBUG ( 634): #02 pc 0000e94e /system/lib/libsensorservice.so
I/DEBUG ( 634): #03 pc 0000a790 /system/lib/libsensorservice.so
I/DEBUG ( 634): #04 pc 0000d4b2 /system/lib/libsensorservice.so
I/DEBUG ( 634): #05 pc 0000d852 /system/lib/libsensorservice.so
I/DEBUG ( 634): #06 pc 00015ece /system/lib/libutils.so
I/DEBUG ( 634): #07 pc 0000153a /system/lib/libsystem_server.so
I/DEBUG ( 634): #08 pc 00001756 /system/lib/libsystem_server.so
I/DEBUG ( 634): #09 pc 0000adb8 /system/lib/libandroid_servers.so
I/DEBUG ( 634): #10 pc 00011cb4 /system/lib/libdvm.so

3、将以上两个文件拷贝到android的编译根路径下面,执行

python hy.panic.py error.txt

方法2使用非常方便,相比于加打印效率大大提高。非常感谢提供脚本的同学。

  1. Android log日志分析 https://www.cnblogs.com/liyiran/p/7686296.html
  2. android动态库死机调试方法 https://blog.csdn.net/andyhuabing/article/details/
  3. 如何读懂和分析Android logcat http://blog.chinaunix.net/uid-29728680-id-5054948.html
  4. 解读Android日志 https://blog.csdn.net/_/article/details/

  • 上一篇: java 自学教程
  • 下一篇: java668集教程
  • 版权声明


    相关文章:

  • java 自学教程2025-01-09 17:50:05
  • java448集教程2025-01-09 17:50:05
  • java教程哪里最好2025-01-09 17:50:05
  • 大专java教程2025-01-09 17:50:05
  • java讲解教程2025-01-09 17:50:05
  • java668集教程2025-01-09 17:50:05
  • java 7教程2025-01-09 17:50:05
  • java nio 系列教程(十)2025-01-09 17:50:05
  • eclipse java web开发教程2025-01-09 17:50:05
  • selenium java教程视频2025-01-09 17:50:05