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

相关推荐
青 春 记 忆2 小时前
Dify Docker Compose 通用无损升级指南:从备份、双版本预演到切换与回滚
运维·人工智能·python·docker·容器
GlueNa2SiO32 小时前
03-Flask模板引擎Jinja2详解
笔记·python·flask
临沂GEO4 小时前
GEO搜索优化科普|正规地理位置流量运营入门指南
大数据·人工智能·python·流量运营
大模型码小白4 小时前
Spring AI Tool 实现自然语言操作 MySQL 数据库详解
服务器·开发语言·数据库·人工智能·python·mysql·spring
荷蒲6 小时前
【小白量化Qbuddy】利用AI学习中文Python
人工智能·python·学习
数据狐(Datafox)7 小时前
京东商品列表API技术解析与落地应用(含标准 JSON 示例)
java·大数据·前端·人工智能·python·数据分析·json
量化吞吐机7 小时前
2026年下半年手工交易规则走向量化表达,产品该先接住哪一步
人工智能·python
Metaphor6928 小时前
使用 Python 读取和删除 Excel 文件属性
python·excel
迷迭香yy9 小时前
Python构建转融券多空识别系统从接口到因子的全流程 IG50免费开源股票数据API接口
开发语言·python·开源
月光船幽幽9 小时前
真实即粗糙,光滑是伪造
人工智能·python