自動化工具之python崩潰日志解析腳本
很多測試人員在測試途中,或者開發(fā)者在自測的途中,會遇到APP crash的情況。
一般的bug,一個合格的測試可以給出明確的重現(xiàn)步驟讓開發(fā)者清晰地知道bug原因;
也有不少bug,很多時候是偶現(xiàn)的,很可能無法再次重現(xiàn)出來,無法重現(xiàn)出來的bug是開發(fā)者頭疼的,測試一般會給出bug的截圖和重現(xiàn)步驟;
而一般crash是比較嚴重的問題,這個時候崩潰日志就尤為重要了,把崩潰日志send給開發(fā)人員,如此才能讓開發(fā)者快速定位到錯誤的原因和位置。
舊的解析崩潰日志的方式
在以前我們是這么解析崩潰日志的
- 桌面新建一個Crash文件夾
- 去目錄
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/下把symbolicatecrash文件拷貝到我們剛才的Crash文件夾中 - 找到潰程序?qū)?yīng)的.dSYM文件,拷貝到我們剛才的Crash文件夾中 比如叫
test.dSYM - 把測試人員給我們的崩潰日志也當?shù)繡rash文件夾中,比如叫
1.crash - 打開終端 CD到Crash文件夾中 執(zhí)行命令
./symbolicatecrash 1.crash test.dSYM > 1.log
這樣解析好的日志就到了1.log文件中,我們用文本編輯器只需打開即可查看
但是有的時候,一不小心放進去的符號文件版本不對應(yīng),那么解析出來的1.log和原來的1.Crash內(nèi)容是一樣的,這時候我為了匹配崩潰日志和符號文件的版本,還要使用下面的命令
-
首先查看dSYM文件的UUID 才剛才的Crash文件夾中執(zhí)行
dwarfdump --uuid test.dSYM
終端會輸出類似這樣的信息UUID: F28A8BE6-4B0B-38C9-9F28-829B4121C88B (armv7) test.dSYM/Contents/Resources/DWARF/*******
UUID: C8424837-BC0F-3F9F-A109-A42271C3E14E (arm64) test.dSYM/Contents/Resources/DWARF/*******
2.用文本編輯器打開1.crash,拉到其中一處Binary Images:的地方,如圖找到UUID

- 若步驟1中包含步驟2中的uuid,那么是匹配的,能正確解析崩潰日志,否則會解析失敗
用自己的腳本去解析
前面的步驟去解析崩潰日志有點繁雜,所以寫了一個python腳本,用于一步解析崩潰日志并校驗uuid
廢話不多說,上代碼(decode.py)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import os
import sys
def txt_wrap_by(start_str, end, html):
start = html.find(start_str)
if start >= 0:
start += len(start_str)
end = html.find(end, start)
if end >= 0:
return html[start:end].strip()
def getCrashFileUUID(filePath):
f = open(filePath) # 返回一個文件對象
line = f.readline() # 調(diào)用文件的 readline()方法
uuid = ''
while line:
if line.startswith('Binary Images:'):
desLine = f.readline()
uuid = txt_wrap_by("<",">",desLine)
break
line = f.readline()
f.close()
return uuid.upper()
def getTagFileUUID(filePath):
ines = os.popen('dwarfdump --uuid ' + filePath).readlines()
uuids = []
for item in ines:
uuid = txt_wrap_by('UUID:', ' (', item)
uuid = uuid.replace('-','').upper()
uuids.append(uuid)
return uuids
def getDevDir():
return os.popen('xcode-select -p').readlines()[0].replace('\n', '')
def getSymbolicatecrashPath():
return getDevDir().replace('Developer', '') + 'SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash'
if len(sys.argv) <= 2:
print "sorry! you must input 2 arg like this:"
print "\t python decode.py 1.crash xxxx.app.dSYM"
exit(0)
crashFilePath = sys.argv[1]
dsymFilePath = sys.argv[2]
print "crashFilePath:" + crashFilePath
print "dsymFilePath:" + dsymFilePath
outPutFilePath = crashFilePath + ".log"
#檢查uuid是否匹配
crashUUID = getCrashFileUUID(crashFilePath)
tagUUIDS = getTagFileUUID(dsymFilePath)
if crashUUID in tagUUIDS:
print "UUID match success! " + crashUUID
else:
print "UUID not match"
exit(0)
#設(shè)置環(huán)境變量
cmd = "export DEVELOPER_DIR=\"" + getDevDir()+"\"\n"
symbolicatecrashPath = getSymbolicatecrashPath()
cmd += symbolicatecrashPath + " " + crashFilePath + " " + dsymFilePath + ' > ' + outPutFilePath + '\n'
cmd += 'open '+outPutFilePath
print os.popen(cmd)
這段腳本在解析崩潰日志之前自己做了UUID的校驗,若UUID不匹配則不取解析,直接提示UUID不匹配
運行環(huán)境
- mac OS系統(tǒng)
- python 2.7(系統(tǒng)自帶的版本)
- 終端執(zhí)行
使用步驟
- 建立一個Crash文件夾
- 將崩潰日志1.crash,符號文件test.dSYM放到Crash文件夾中
- 終端cd到Crash文件夾中,執(zhí)行如果解析成功,終端顯示如下
dsymFilePath:test.dSYM
UUID match success! 2DD2DDA45509307BBABD93ADCF36492A
解析后的日志寫到了1.log中,這里輸出的文件名不用寫
如果UUID不匹配,提示如下
dsymFilePath:test.dSYM
UUID not match