Monkey日志ANR、CRASH、空指针异常及其他异常数据分析
引言
在Android开发过程中,monkey测试是一种常用的随机测试手段,用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息,包括应用程序崩溃(Crash)、无响应(ANR)、空指针异常(NullPointerException)等异常情况。本文将介绍如何利用Python脚本和CMD批处理命令来解析这些日志文件,快速定位问题所在,并统计异常发生的次数。
准备工作
- Monkey测试执行:首先需要运行monkey测试并获取日志文件。
- 日志文件:确保你有一个或多个monkey测试生成的日志文件供分析使用。
步骤一:日志文件的预处理
在开始分析之前,我们通常需要对原始日志文件进行一定的预处理,比如提取关键信息到新的文件中。
使用CMD批处理命令
创建一个简单的批处理文件来复制日志文件中的关键行到新文件中:
@echo off
setlocal enabledelayedexpansion
set logFile=monkey_log.txt
set outputFile=monkey_anr_crash.log
> %outputFile% (
for /f "tokens=*" %%a in (%logFile%) do (
if "%%a" == "ANR:" (
echo ANR detected.
echo %%a
) else if "%%a" == "CRASH:" (
echo CRASH detected.
echo %%a
)
)
)
步骤二:使用Python进行详细分析
接下来,我们将使用Python来进一步分析这些关键行,以找出发生ANR、CRASH、空指针异常以及其他异常的具体位置和页面,并统计每个页面发生异常的次数。
Python脚本
import re
def parse_monkey_log(log_file):
anr_counts = {}
crash_counts = {}
null_pointer_counts = {}
other_exception_counts = {}
with open(log_file, 'r') as file:
for line in file:
# 检查是否是ANR行
if 'ANR:' in line:
match = re.search(r'ANR: (.*) at', line)
if match:
page = match.group(1)
anr_counts[page] = anr_counts.get(page, 0) + 1
# 检查是否是CRASH行
elif 'CRASH:' in line:
match = re.search(r'CRASH: (.*) at', line)
if match:
page = match.group(1)
crash_counts[page] = crash_counts.get(page, 0) + 1
# 检查是否是空指针异常
elif 'NullPointerException' in line:
match = re.search(r'NullPointerException.*at (.*)', line)
if match:
page = match.group(1)
null_pointer_counts[page] = null_pointer_counts.get(page, 0) + 1
# 检查其他异常
elif 'Exception' in line and not 'NullPointerException' in line:
match = re.search(r'Exception.*at (.*)', line)
if match:
page = match.group(1)
other_exception_counts[page] = other_exception_counts.get(page, 0) + 1
return anr_counts, crash_counts, null_pointer_counts, other_exception_counts
# 主函数
if __name__ == "__main__":
log_file = "monkey_anr_crash.log"
anr_counts, crash_counts, null_pointer_counts, other_exception_counts = parse_monkey_log(log_file)
print("ANRs found:")
for page, count in anr_counts.items():
print(f"{page}: {count} times")
print("\nCrashes found:")
for page, count in crash_counts.items():
print(f"{page}: {count} times")
print("\nNullPointerExceptions found:")
for page, count in null_pointer_counts.items():
print(f"{page}: {count} times")
print("\nOther Exceptions found:")
for page, count in other_exception_counts.items():
print(f"{page}: {count} times")
测试
假设使用应用宝进行测试,使用一下命令连接模拟器然后运行monkey命令
adb connect 127.0.0.1:62025
adb shell monkey --throttle 500 --ignore-crashes --ignore-timeouts --ignore-security-exceptions --ignore-native-crashes --monitor-native-crashes --kill-process-after-error --pct-touch 20 --pct-motion 20 --pct-trackball 10 --pct-nav 10 --pct-majornav 10 --pct-syskeys 10 --pct-appswitch 10 --pct-anyevent 5 -p com.tencent.android.qqdownloader 6000 > /monkey_output.log
运行脚本进行解析即可知道运行结果
结论
通过上述步骤,我们可以有效地从大量的monkey日志文件中提取ANR、CRASH、空指针异常以及其他异常的信息,并进一步定位到具体的页面和位置。这种方法可以显著提高问题定位的速度和准确性,并且统计了每个页面发生异常的次数,有助于进一步分析和优化应用的稳定性。
后记
如果您希望进一步扩展这个脚本的功能,例如增加错误统计或者图形化展示结果,可以考虑使用更高级的数据处理库如Pandas和可视化库如Matplotlib。
请注意,这个例子假设您的日志文件中已经包含了类似于“ANR: MainActivity at”、“CRASH: SplashActivity at”、“NullPointerException at ActivityName”等格式。根据实际日志文件的内容,您可能需要调整正则表达式来匹配特定的模式。
通过这样的流程,您可以高效地处理monkey测试产生的日志文件,并快速识别出需要关注的问题点。这将有助于提升应用的质量和用户体验。