Android——Matirx 自动生成火焰图小工具

Posted 化作孤岛的瓜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android——Matirx 自动生成火焰图小工具相关的知识,希望对你有一定的参考价值。

最近在研究腾讯的Matirx框架,发现框架在抓取慢方法信息的时候会产出堆栈信息,如下格式:


	"machine": "BEST",
	"detail": "EVIL_METHOD",
	"time_after_startup": 25882,
	"token": 111906390058924,
	"cost": 4256,
	"begin_time": 111906390,
	"begin_timestamp": 1667613213802,
	"usage": "12.97%",
	"scene": "com.uc.browser.InnerUCMobile",
	"stack": "0,1048574,1,4256\\n1,...,143186,1,48\\n",
	"stackKey": "29419-73268",
	"tag": "Trace_EvilMethod",
	"process": "com.UCMobile",
	"time": 1667613220349

于是写了一个工具包(整合了matrix-trace-processor-master和FlameGraph框架),可以将Matirx抓到的堆栈信息stack自动生成火焰图svg文件,主要代码如下:

import json
import os


def split_lines(s):
    return s.split('\\n')


# 文件路径
fileDir = '/Users/xiaoguagua/Desktop/fire'
mappingTxtFilePath = fileDir + '/methodMapping.txt'
matrixStackLogFile = fileDir + '/matrix-trace-processor-master'

# stack json解析
rawFile = open(fileDir + "/stack", 'r')
jsonStr = rawFile.read()
rawFile.close()
jsonData = json.loads(jsonStr)
stackJson = jsonData['stack']
stackSplit = split_lines(stackJson)
print(stackSplit)

# 在matrix工程下生成新的stack文件
stackFile = open(matrixStackLogFile + '/stack.log', 'w')
for temp in range(0, len(stackSplit) - 1):
    stackFile.writelines(stackSplit[temp] + "\\\\n" + "\\n")
stackFile.close()

# 步骤一:python3 main.py workflow_traces stack.log > stack_processor.txt methodMapping.txt 生成processor
matrixMainPyPath = matrixStackLogFile + '/main.py'
stackFilePath = matrixStackLogFile + '/stack.log'
stack_processorPath = matrixStackLogFile + '/stack_processor.txt'

matrixCommend = 'python3 ' + matrixMainPyPath + ' workflow_traces ' + stackFilePath + ' > ' + stack_processorPath + ' ' + mappingTxtFilePath
print('执行1:' + matrixCommend)
os.system(matrixCommend)

# 步骤二:./stackcollapse.pl stack_processor.txt > stack.folded 生成folded
flameGraphFilePath = fileDir + '/FlameGraph-master'
flameFoldedFilePath = fileDir + '/FlameGraph-master/stack.folded'

foldedCommend = flameGraphFilePath + '/stackcollapse.pl ' + stack_processorPath + ' > ' + flameFoldedFilePath
print('执行2:' + foldedCommend)
os.system(foldedCommend)

# 步骤三:./flamegraph.pl stack.folded > stack.svg 生成svg
flameSvgFilePath = fileDir + '/stack.svg'

svgCommend = flameGraphFilePath + '/flamegraph.pl ' + flameFoldedFilePath + ' > ' + flameSvgFilePath
print('执行3:' + svgCommend)
os.system(svgCommend)

print('生成svg成功')

使用方式:

1.修改main.py中的文件路径为工具包fire文件的真实路径:

# 文件路径

fileDir = '/Users/xiaoguagua/Desktop/fire'

2.把Matirx生成的堆栈文件与mapping文件放到fire根目录下

3.终端运行python3 main.py

4.可以看到svg自动生成出来了

 工具包:

https://download.csdn.net/download/qq_22770457/86912240

以上是关于Android——Matirx 自动生成火焰图小工具的主要内容,如果未能解决你的问题,请参考以下文章

Android——Matirx 自动生成火焰图小工具

Android——Matirx 自动生成火焰图小工具

simpleperf 火焰图

Arthas生成Kafka火焰图

[RK3568 Android11]火焰图详解

[RK3568 Android11]火焰图详解