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

相关推荐
进击的六角龙44 分钟前
Python中处理Excel的基本概念(如工作簿、工作表等)
开发语言·python·excel
一只爱好编程的程序猿1 小时前
Java后台生成指定路径下创建指定名称的文件
java·python·数据下载
Aniay_ivy1 小时前
深入探索 Java 8 Stream 流:高效操作与应用场景
java·开发语言·python
gonghw4031 小时前
DearPyGui学习
python·gui
向阳12181 小时前
Bert快速入门
人工智能·python·自然语言处理·bert
engchina1 小时前
Neo4j 和 Python 初学者指南:如何使用可选关系匹配优化 Cypher 查询
数据库·python·neo4j
兆。2 小时前
掌握 PyQt5:从零开始的桌面应用开发
开发语言·爬虫·python·qt
南宫理的日知录2 小时前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
coberup2 小时前
django Forbidden (403)错误解决方法
python·django·403错误
龙哥说跨境3 小时前
如何利用指纹浏览器爬虫绕过Cloudflare的防护?
服务器·网络·python·网络爬虫