前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >抓取Android APP崩溃和无响应日志的小工具

抓取Android APP崩溃和无响应日志的小工具

作者头像
张树臣
发布2019-03-04 15:22:41
3.3K0
发布2019-03-04 15:22:41
举报
文章被收录于专栏:软件测试经验与教训

前言

在Android APP的测试过程中经常遇到crash和anr,开发人员习惯通过eclipse或者eclipse的ddms组件进行捕抓日志,测试人员常通过在dos窗口下adb命令的方式来抓取日志。前者的缺点是启动时非常耗时,后者呢则每次都要写命令也比较麻烦(需要截图时也存在这个问题)。针对这样的情况,本文分享一个通过adb程序与bat命令组合的技巧来抓取日志,只要3~5秒即可获取崩溃日志,非常快捷。

1. 准备工作

一、安装JDK(好像不装也没关系,未实测)和ADB(V1.0.31版本或以上),网上很多指导方法,这里就赘述了。

二、在PATH环境变量中添加ADB路径。这样就能在任意地方调用ADB命令,如adb.exe的位置在c:\adb\adb.exe,则在path中加入c:\adb。

2. 制作捕获日志的批命令

一、制作捕获crash异常的批命令

将以下命令复制,制作成logcat.bat文件。logcat.bat可以放置任意位置(如:桌面)。

代码语言:javascript
复制
@ECHO OFF
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
SET timeStamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
SET mutID=_mut
@ECHO ON
adb logcat -v time > .\"%mutID%_%timeStamp%_logcat.log"
pause

原理:

该工具的原理是bat文件调用adb工具,将手机运行日志拉到本地,并将实时日志也记录到本地。

用法:

当手机需要重现crash、或者x分钟内已经发生过crash(x≈15~30),点击此bat,logcat命令会将手机的logcat日志拉下来并实时记录,直到你关闭cmd窗口。然后在拉下来的txt中寻找fatal字眼,附近上下文即为crash日志。

二、制作捕获ANR异常的批命令

anr:Application Not Responding -- 程序无响应。

将以下命令复制,制作成“ANR捕获.bat”文件。“ANR捕获.bat”可以放置任意位置(如:桌面)。

代码语言:javascript
复制
@ECHO OFF
for /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"
SET timeStamp=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%
SET mutID=_mut
@ECHO ON
adb pull data/anr/traces.txt traces_%timeStamp%.txt

原理:

同上,将手机的traces.txt拉到本地。手机发生anr之后可以用,但一般用不上。

三、优点与限制

  1. 手机无需root
  2. 无需eclipse支持
  3. 方便保存、查找日志
  4. 实时日志不能在cmd窗口回显

3. 演示

以抓取crash异常为例:

步骤1:将android手机连接电脑,开启开发者模式并允许usb调试;

步骤2:运行logcat.bat文件,会出现cmd窗口;

步骤3:①如果手机程序已经发生过crash,5秒后关闭cmd窗口;②如果是想重现crash,则在手机端重现后即可关闭cmd窗口。

步骤4:在logcat.bat的同级目录下会生成一份log文件,从文件中搜查FATAL关键字,便可找到崩溃代码。

4. 代码注释

在这个工具里,因为想用“截图+系统当前日期”的格式来命令日志文件,所以采用了bat命令中的一个函数“timeStamp”。

最初的写法:

代码语言:javascript
复制
set timeStamp=%date:/=-%_%time%echo %timeStamp%
>2018-01-23_11:23:44.43

这个语句能实现我们的要求,但这样写会引发两个严重的问题:

1、10点前的timeStamp会出现空格;

2、%date%和%time%都是直接读windows的时间格式(也就是右下角的那个时间格式),会出现不通用的结果。

改进后的方案:

采用wmic来格式化时间,得出YYYYMMDDHHMinSec,这样就不会出现任何格式问题,代码如下:

代码语言:javascript
复制
@echo offfor /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"echo %dt:~0,14%
>20180123112344

然后在此基础上加各种分隔符:

代码语言:javascript
复制
@echo offfor /f "tokens=2 delims==" %%a in ('wmic OS Get localdatetime /value') do set "dt=%%a"echo %dt:~0,4%-%dt:~4,2%-%dt:~6,2%_%dt:~8,2%-%dt:~10,2%-%dt:~12,2%>2018-01-23_11-23-44

完毕

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 软件测试经验与教训 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档