使用Python和CMD批量分析Monkey日志ANR、CRASH、空指针异常及其他异常数据

引言

在Android开发过程中,monkey测试是一种常用的随机测试手段,用于模拟用户的各种操作来发现应用中的稳定性问题。通过monkey测试生成的日志文件包含了丰富的信息,包括应用程序崩溃(Crash)、无响应(ANR)、空指针异常(NullPointerException)等异常情况。本文将介绍如何利用Python脚本和CMD批处理命令来解析这些日志文件,快速定位问题所在,并统计异常发生的次数。

准备工作

  1. Monkey测试执行:首先需要运行monkey测试并获取日志文件。
  2. 日志文件:确保你有一个或多个monkey测试生成的日志文件供分析使用。

步骤一:日志文件的预处理

在开始分析之前,我们通常需要对原始日志文件进行一定的预处理,比如提取关键信息到新的文件中。

使用CMD批处理命令

创建一个简单的批处理文件来复制日志文件中的关键行到新文件中:

batch 复制代码
@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脚本
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命令

bash 复制代码
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测试产生的日志文件,并快速识别出需要关注的问题点。这将有助于提升应用的质量和用户体验。

相关推荐
计算机编程小央姐39 分钟前
数据安全成焦点:基于Hadoop+Spark的信用卡诈骗分析系统实战教程
大数据·hadoop·python·spark·毕业设计·课程设计·dash
max5006001 小时前
本地部署开源数据生成器项目实战指南
开发语言·人工智能·python·深度学习·算法·开源
MonkeyKing_sunyuhua1 小时前
mac怎么安装uv工具
python·macos·uv
Source.Liu2 小时前
【Python基础】 19 Rust 与 Python if 语句对比笔记
笔记·python·rust
工业互联网专业2 小时前
基于Spark的新冠肺炎疫情实时监控系统_django+spider
python·spark·django·vue·毕业设计·源码·课程设计
Yh8702032 小时前
2025年经济学专业女生必考证书指南:打造差异化竞争力
python
BYSJMG2 小时前
大数据毕业设计推荐:基于Spark的零售时尚精品店销售数据分析系统【Hadoop+python+spark】
大数据·hadoop·python·spark·django·课程设计
醉方休3 小时前
python 自动化在web领域应用
python
Source.Liu3 小时前
【Python基础】 18 Rust 与 Python print 函数完整对比笔记
笔记·python·rust
大模型真好玩3 小时前
大模型工程面试经典(五)—大模型专业领域微调数据集如何构建?
人工智能·python·面试