Android log 日志分析
一. Log
日志中 Bug
类型
- 程序异常强制关闭:
Force Close
,Fatal
- 程序无响应:
Application Not Response
,ANR
(应用无响应)。一般是主线程超时无响应造成的。ANR
类型有:keyDispatchTimeout(Activity)
:5秒无响应位于
ActivityManagerService.java
类中// How long we wait until we timeout on key dispatching.
static final int KEY_DISPATCHING_TIMEOUT = 5*1000;
BroadcaseTimeout(Receiver)
:10秒无响应ServiceTimeout(Service)
:20秒无响应
ANR
产生原因:- 在
UI
线程做了耗时操作。比如在Activity
中做了超过 5 秒无响应的耗时操作,比如文件读写,数据库读写,就会出现ANR
- 在
- ANR 避免:
- 不要在
UI
线程做耗时操作。
- 不要在
一. log
日志文件的位置
- 可以通过在
application
中实现接口:UncaughtExceptionHandler
, 在实现的 ·uncaughtException()· 方法中把产生的log
保存到本地。
二. log
日志文件的结构
三. log
日志中 bug
的查找和分析
日志文件关键字
Force Close
:Fatal
Application Not Response
:ANR
查看 Log 基本步骤
- 如果是
ANR
问题,在日志文件中搜索ANR
,快速定位到关键事件信息。 - 如果是
Force Close
或其他异常退出,搜索FATAL
,快速定位到关键事件信息。 - 定位到关键事件信息后,查看信息是否明确,如何不明确的话,查看具体的进程和线程跟踪的日志,来定位 bug
- 如果是
Force Close
快速定位案例出现了
Force Close
的情况,搜索关键字FATAL
,得到以下Log
。10-18 14:36:35.197 16078 16078 E AndroidRuntime: FATAL EXCEPTION: main
10-18 14:36:35.197 16078 16078 E AndroidRuntime: Process: cc.lijingbo.crashhandler, PID: 16078
10-18 14:36:35.197 16078 16078 E AndroidRuntime: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at cc.lijingbo.crashhandler.MainActivity$1.onClick(MainActivity.java:23)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at android.view.View.performClick(View.java:5232)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at android.view.View$PerformClick.run(View.java:21289)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at android.os.Handler.handleCallback(Handler.java:739)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:95)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at android.os.Looper.loop(Looper.java:168)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:5885)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:797)
10-18 14:36:35.197 16078 16078 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:687)
10-18 14:36:35.207 1187 17570 E ActivityManager: App crashed! Process: cc.lijingbo.crashhandler
10-18 14:36:35.207 1187 17570 W ActivityManager: Force finishing activity cc.lijingbo.crashhandler/.MainActivity
看到因为
NullPointerException
造成的。
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.CharSequence android.widget.TextView.getText()' on a null object reference然后下一句提示项目的代码出错的地方:
at cc.lijingbo.crashhandler.MainActivity$1.onClick(MainActivity.java:23)
,在MainActivity
的onClick
方法的第23
行源码
public class MainActivity extends AppCompatActivity {private TextView tv1;
private TextView tv2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv1 = (TextView) findViewById(R.id.tv1);
tv1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(MainActivity.this, tv2.getText().toString(), Toast.LENGTH_SHORT).show();
}
});
}
}
可以看到是因为使用
Toast
的时候,tv2
没有初始化,造成的空指针,把tv2
初始化就可以了。
ANR
快速定位案例
四. adb logcat
的学习和使用
- 抓取设备中日志到指定目录
- adb logcat >crash.log
参考:
Logcat 官网语法: https://developer.android.google.cn/studio/command-line/logcat.html#Syntax
Logcat 的使用:https://developer.android.google.cn/studio/debug/am-logcat.html
Analyze a Stack Trace: https://developer.android.google.cn/studio/debug/stacktraces.html
studio debug: https://developer.android.google.cn/studio/debug/index.html
如何分析解决 ANR : http://blog.csdn.net/dadoneo/article/details/8270107
Android log 日志分析的更多相关文章
- (转)DB2 db2diag.log 日志分析
DB2 db2diag.log 日志分析 原文:http://blog.csdn.net/lyjiau/article/details/52129997 db2diag.log是用来记录DB2数据库运 ...
- [日志分析] Access Log 日志分析
0x00.前言: 如何知道自己所在的公司或单位是否被入侵了?是没人来“黑”,还是因自身感知能力不足,暂时还没发现?入侵检测是每个安全运维人员都要面临的严峻挑战.安全无小事,一旦入侵成功,后果不堪设想. ...
- Android Log日志文件的分析、查看
Log 在android中的地位非常重要,要是作为一个android程序员不能过分析log这关,算是android没有入门吧 . 下面我们就来说说如何处理log文件 什么时候会产生log文件呢 ?一般 ...
- Android log日志
LOG是用来记录程序执行过程的机制,它既可以用于程序调试,也可以用于产品运营中的事件记录.在Android系统中,提供了简单.便利的LOG机制,开发人员可以方便地使用. androidsdk中提供了l ...
- 27、android log日志
一.记住 加写sd卡权限 二.代码 package com.example.logtest; import java.io.File; import java.io.IOException; impo ...
- nginx acces.log日志分析
1,统计各访问IP的总数 awk '{if($9>0 && $9==200 && substr($6,2)== "GET") a[$1]++} ...
- Android ANR从原理到日志分析,记下来就够了
站在巨人的肩膀上可以看的更远 做一个优秀的搬运工 Android 彻底理解安卓应用无响应机制 Android ANR日志分析全面解析 优秀的文章不可独享,要扩散,要做好笔记,哈 <沁园春长沙&g ...
- Android Native/Tombstone Crash Log 详细分析(转)
转自:http://weibo.com/p/230418702c2db50102vc2h Android 虽然已经有好几年了,但是NDK的开放速度却非常缓慢,所以目前网络上针对对Android Nat ...
- Android输出日志Log类并保存到文件中
android.util.Log常用的方法有以下5个: Log.v() Log.d() Log.i() Log.w() 以及 Log.e().根据首字母分别对应VERBOSE,DEBUG,INFO,W ...
随机推荐
- ios网络学习------9 播放网络视频
IOS提供了叫做MPMoviePlayerController MPMoviePlayerViewController两个类.能够轻松用来实现视频播放. MPMoviePlayerViewContr ...
- ReactNative踩坑日志——使用async/await语法解决网络请求的异步导致的指令执行顺序错乱问题
转载请注明原文地址: ReactNative的fetch是天然的异步请求,因此,如果你在一个代码块中使用了fetch,那么在执行的时候程序不会等待网络响应结束才执行下一条代码,而是会直接按顺序执行完整 ...
- EF Code First导航属性一对一关系中注意点及配置方法
//学生 public class Student { [key] public int StId { get; set; } public int SocialSecurityNumber { ge ...
- ysql怎么处理百分数? “%”
)将百分数转化为小数,再以浮点数数据类型float输入 )设置字段类型为varchar数据类型,将百分数输入为文本数据,需要计算或提取出来的时候,再转化为数值类型 //转换数据类型
- Java邻接表表示加权有向图,附dijkstra最短路径算法
从A到B,有多条路线,要找出最短路线,应该用哪种数据结构来存储这些数据. 这不是显然的考查图论的相关知识了么, 1.图的两种表示方式: 邻接矩阵:二维数组搞定. 邻接表:Map<Vertext, ...
- 【Android开发经验】怎样查看android-support-v4支持包中的源代码
在support-v4包里面.加入了非常多的支持控件,比方ViewPager,Fragment等,为了解决一些问题,我们有时候想要看一下实现源代码,可是点进去之后.源代码并不会显示出来,会出现以下的情 ...
- Jqeury Mobile实战之切屏效果以及屏幕滚动到底端加载更多和点击切换更多
http://blog.csdn.net/q718330882/article/details/46120691 //页面滚动到底部加载更多事件 $( window ).scroll(function ...
- 【MySQL】MySQL主从库配置和主库宕机解决方案
1.转载:https://blog.csdn.net/zfl589778/article/details/51441719/ 2.效果:亲测有效,数据写入成功. 3.主机宕机后,如果不是长时间宕机,且 ...
- db_table--Spring Security3.1 最新配置实例
2011-04-28 这几天学习了一下Spring Security3.1,从官网下载了Spring Security3.1版本进行练习,经过多次尝试才摸清了其中的一些原理.本人不才,希望能帮助大家. ...
- open()系统调用的实现
open系统调用的服务例程是sys_open()函数,它接受三个参数:要打开文件的路径名filename, 访问模式的表示flags和文件权限掩码mode.在内核中,sys_open实际调用do_sy ...