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

相关推荐
Q_Q5110082851 小时前
python+django/flask的情绪宣泄系统
spring boot·python·pycharm·django·flask·node.js·php
撸码猿1 小时前
《Python AI入门》第9章 让机器读懂文字——NLP基础与情感分析实战
人工智能·python·自然语言处理
二川bro1 小时前
多模态AI开发:Python实现跨模态学习
人工智能·python·学习
2301_764441331 小时前
Python构建输入法应用
开发语言·python·算法
love530love1 小时前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui
青瓷程序设计2 小时前
昆虫识别系统【最新版】Python+TensorFlow+Vue3+Django+人工智能+深度学习+卷积神经网络算法
人工智能·python·深度学习
秋邱2 小时前
智启未来:AGI 教育融合 × 跨平台联盟 × 个性化空间,重构教育 AI 新范式开篇:一场 “教育 ×AI” 的范式革命
人工智能·python·重构·推荐算法·agi
爱吃泡芙的小白白2 小时前
vscode、anaconda、git、python配置安装(自用)
ide·git·vscode·python·anaconda·学习记录
谷隐凡二2 小时前
Kubernetes主从架构简单解析:基于Python的模拟实现
python·架构·kubernetes
老歌老听老掉牙2 小时前
Matplotlib Pyplot 数据可视化完全指南
python·信息可视化·matplotlib