[Python] Native Crash Addr2line 自动解析Tombstone文件脚本

文末附上脚本源码
2019.4.24 更新,32位,64位 进程tombstone的兼容

使用方法

1.解析单个tombstone文件:

python ./as_tomba.py tombstone_file_path symbol_root_path
在tombstone_file_path目录下生成 tombstone文件名_pid_pname.out 的解析之后文件

2.批量解析文件夹中的tombstone文件:

python ./as_tomba.py tombstone_file_dir symbol_root_path
将tombstone_file_dir目录下的含有tombstone调用栈的文件解析输出到该目录下相应的输出文件中

3.兼容logcat中的tombstone调用栈

如logcat中有如下log:

01-09 14:11:02.220 16332 16811 F libc : Fatal signal 6 (SIGABRT), code -6 (SI_TKILL) in tid 16811 (HwBinder:16332_), pid 16332 (provider@2.4-se)
01-09 14:11:02.278 17079 17079 I crash_dump64: obtaining output fd from tombstoned, type: kDebuggerdTombstone
01-09 14:11:02.278 888 888 I /system/bin/tombstoned: received crash request for pid 16811
01-09 14:11:02.280 17079 17079 I crash_dump64: performing dump of process 16332 (target tid = 16811)
01-09 14:11:02.286 17079 17079 F DEBUG : *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
01-09 14:11:02.286 17079 17079 F DEBUG : Build fingerprint: 'xiaomi/violet/violet:9/PKQ1.181203.001/9.1.9:user/release-keys'
01-09 14:11:02.286 17079 17079 F DEBUG : Revision: '0'
01-09 14:11:02.286 17079 17079 F DEBUG : ABI: 'arm64'
01-09 14:11:02.286 17079 17079 F DEBUG : pid: 16332, tid: 16811, name: HwBinder:16332_ >>> /vendor/bin/hw/android.hardware.camera.provider@2.4-service_64 <<<
01-09 14:11:02.286 17079 17079 F DEBUG : signal 6 (SIGABRT), code -6 (SI_TKILL), fault addr --------
01-09 14:11:02.286 17079 17079 F DEBUG : Abort message: 'Invalid address 0x7be6e0d180 passed to free: value not allocated'
01-09 14:11:02.286 17079 17079 F DEBUG : x0 0000000000000000 x1 00000000000041ab x2 0000000000000006 x3 0000000000000008
01-09 14:11:02.286 17079 17079 F DEBUG : x4 8080808080808080 x5 8080808080808080 x6 8080808080808080 x7 0000000000000008
01-09 14:11:02.286 17079 17079 F DEBUG : x8 0000000000000083 x9 49bf711238106b52 x10 0000000000000000 x11 fffffffc7fffffdf
01-09 14:11:02.286 17079 17079 F DEBUG : x12 0000000000000001 x13 000000005c35b39e x14 000c568e6e9f9200 x15 0000d19ff0bea88d
01-09 14:11:02.286 17079 17079 F DEBUG : x16 0000007c3320f2b8 x17 0000007c3312ec50 x18 ffffffffffffff60 x19 0000000000003fcc
01-09 14:11:02.286 17079 17079 F DEBUG : x20 00000000000041ab x21 0000007be6e0d180 x22 0000000000000000 x23 0000007c3321b8d8
01-09 14:11:02.286 17079 17079 F DEBUG : x24 0000007c254a5eb8 x25 0000007c3092cda0 x26 0000007c254a5eb8 x27 0000007c254a5eb8
01-09 14:11:02.286 17079 17079 F DEBUG : x28 0000007c254a5eb8 x29 0000007c0501f300
01-09 14:11:02.286 17079 17079 F DEBUG : sp 0000007c0501f2c0 lr 0000007c331220c4 pc 0000007c331220ec
01-09 14:11:02.323 711 711 I ConfigStore: android::hardware::configstore::V1_0::ISurfaceFlingerConfigs::hasHDRDisplay retrieved: 0
01-09 14:11:02.325 17079 17079 F DEBUG :
01-09 14:11:02.325 17079 17079 F DEBUG : backtrace:
01-09 14:11:02.325 17079 17079 F DEBUG : #00 pc 00000000000220ec /system/lib64/libc.so (abort+116)
01-09 14:11:02.325 17079 17079 F DEBUG : #01 pc 00000000000b430c /system/lib64/libc.so (ifree+1172)
01-09 14:11:02.325 17079 17079 F DEBUG : #02 pc 00000000000b4418 /system/lib64/libc.so (je_free+120)
01-09 14:11:02.325 17079 17079 F DEBUG : #03 pc 00000000000cee9c /vendor/lib64/hw/com.qti.chi.override.so (ChxUtils::AndroidMetadata::FreeMetaData(void*)+28)
01-09 14:11:02.325 17079 17079 F DEBUG : #04 pc 0000000000099788 /vendor/lib64/hw/com.qti.chi.override.so (ChiMetadataManager::AndroidMetadataHolder::~AndroidMetadataHolder()+160)
01-09 14:11:02.325 17079 17079 F DEBUG : #05 pc 00000000000de150 /vendor/lib64/hw/com.qti.chi.override.so (std::_1::vector_base<ChiMetadataManager::AndroidMetadataHolder, std::1::allocator<ChiMetadataManager::AndroidMetadataHolder>>::~_vector_base()+72)
01-09 14:11:02.325 17079 17079 F DEBUG : #06 pc 00000000000de034 /vendor/lib64/hw/com.qti.chi.override.so (std::_1::vector<ChiMetadataManager::AndroidMetadataHolder, std::_1::allocator<ChiMetadataManager::AndroidMetadataHolder>>::~vector()+20)
01-09 14:11:02.325 17079 17079 F DEBUG : #07 pc 0000000000099a14 /vendor/lib64/hw/com.qti.chi.override.so (ChiMetadataManager::~ChiMetadataManager()+84)
01-09 14:11:02.325 17079 17079 F DEBUG : #08 pc 0000000000099d9c /vendor/lib64/hw/com.qti.chi.override.so (ChiMetadataManager::Destroy()+28)
01-09 14:11:02.325 17079 17079 F DEBUG : #09 pc 00000000000ad694 /vendor/lib64/hw/com.qti.chi.override.so (Usecase::DestroyObject(int)+1476)
01-09 14:11:02.325 17079 17079 F DEBUG : #10 pc 000000000005d45c /vendor/lib64/hw/com.qti.chi.override.so (ExtensionModule::TeardownOverrideUsecase(camera3_device const*, int)+220)
01-09 14:11:02.325 17079 17079 F DEBUG : #11 pc 00000000000616f4 /vendor/lib64/hw/com.qti.chi.override.so (ExtensionModule::TeardownOverrideSession(camera3_device const*, unsigned long, void*)+164)
01-09 14:11:02.325 17079 17079 F DEBUG : #12 pc 000000000005bde8 /vendor/lib64/hw/com.qti.chi.override.so (chi_teardown_override_session(camera3_device const*, unsigned long, void*)+56)
01-09 14:11:02.326 17079 17079 F DEBUG : #13 pc 00000000000ccd28 /vendor/lib64/hw/camera.qcom.so (CamX::close(hw_device_t*)+1768)
01-09 14:11:03.363 857 1000 E storaged: getDiskStats failed with result NOT_SUPPORTED and size 0
01-09 14:11:02.324 711 711 I chatty : uid=1000(system) /system/bin/surfaceflinger identical 2 lines

将该log贴到指定文件中跑脚本:

python ./as_tombstone_analysis/as_tomba.py ./as_tombstone_analysis/log_demo/ne_log_crash.txt /home/chengang/Documents/f7b_issue/symbols/9.1.9_in/out/target/product/violet/symbols

输出文件:

文件解析结果:

01-09 14:11:02.325 17079 17079 F DEBUG : #00 pc 00000000000220ec /system/lib64/libc.so (abort+116)abort
bionic/libc/bionic/abort.cpp:7301-09 14:11:02.325 17079 17079 F DEBUG : #01 pc 00000000000b430c /system/lib64/libc.so (ifree+1172)je_arena_dalloc
external/jemalloc/include/jemalloc/internal/arena.h:145301-09 14:11:02.325 17079 17079 F DEBUG : #02 pc 00000000000b4418 /system/lib64/libc.so (je_free+120)je_free
external/jemalloc/src/jemalloc.c:?01-09 14:11:02.325 17079 17079 F DEBUG : #03 pc 00000000000cee9c /vendor/lib64/hw/com.qti.chi.override.so (ChxUtils::AndroidMetadata::FreeMetaData(void*)+28)ChxUtils::AndroidMetadata::FreeMetaData(void*)
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxutils.cpp:75501-09 14:11:02.325 17079 17079 F DEBUG : #04 pc 0000000000099788 /vendor/lib64/hw/com.qti.chi.override.so (ChiMetadataManager::AndroidMetadataHolder::~AndroidMetadataHolder()+160)~AndroidMetadataHolder
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxmetadata.cpp:81401-09 14:11:02.325 17079 17079 F DEBUG : #05 pc 00000000000de150 /vendor/lib64/hw/com.qti.chi.override.so (std::_1::vector_base<ChiMetadataManager::AndroidMetadataHolder, std::1::allocator<ChiMetadataManager::AndroidMetadataHolder>>::~_vector_base()+72)std::__1::allocator<ChiMetadataManager::AndroidMetadataHolder>::destroy(ChiMetadataManager::AndroidMetadataHolder*)
external/libcxx/include/memory:186001-09 14:11:02.325 17079 17079 F DEBUG : #06 pc 00000000000de034 /vendor/lib64/hw/com.qti.chi.override.so (std::_1::vector<ChiMetadataManager::AndroidMetadataHolder, std::_1::allocator<ChiMetadataManager::AndroidMetadataHolder>>::~vector()+20)~vector
external/libcxx/include/vector:44701-09 14:11:02.325 17079 17079 F DEBUG : #07 pc 0000000000099a14 /vendor/lib64/hw/com.qti.chi.override.so (ChiMetadataManager::~ChiMetadataManager()+84)~ChiMetadataManager
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxmetadata.cpp:96501-09 14:11:02.325 17079 17079 F DEBUG : #08 pc 0000000000099d9c /vendor/lib64/hw/com.qti.chi.override.so (ChiMetadataManager::Destroy()+28)ChiMetadataManager::Destroy()
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxmetadata.cpp:84701-09 14:11:02.325 17079 17079 F DEBUG : #09 pc 00000000000ad694 /vendor/lib64/hw/com.qti.chi.override.so (Usecase::DestroyObject(int)+1476)Usecase::DestroyObject(int)
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxusecase.cpp:17201-09 14:11:02.325 17079 17079 F DEBUG : #10 pc 000000000005d45c /vendor/lib64/hw/com.qti.chi.override.so (ExtensionModule::TeardownOverrideUsecase(camera3_device const*, int)+220)ExtensionModule::TeardownOverrideUsecase(camera3_device const*, int)
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxextensionmodule.cpp:212901-09 14:11:02.325 17079 17079 F DEBUG : #11 pc 00000000000616f4 /vendor/lib64/hw/com.qti.chi.override.so (ExtensionModule::TeardownOverrideSession(camera3_device const*, unsigned long, void*)+164)ExtensionModule::TeardownOverrideSession(camera3_device const*, unsigned long, void*)
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxextensionmodule.cpp:207401-09 14:11:02.325 17079 17079 F DEBUG : #12 pc 000000000005bde8 /vendor/lib64/hw/com.qti.chi.override.so (chi_teardown_override_session(camera3_device const*, unsigned long, void*)+56)chi_teardown_override_session(camera3_device const*, unsigned long, void*)
vendor/qcom/proprietary/chi-cdk/vendor/chioverride/default/chxextensioninterface.cpp:50401-09 14:11:02.326 17079 17079 F DEBUG : #13 pc 00000000000ccd28 /vendor/lib64/hw/camera.qcom.so (CamX::close(hw_device_t*)+1768)CamX::close(hw_device_t*)
vendor/qcom/proprietary/camx/src/core/hal/camxhaldevice.cpp:956

自动解析tombstone脚本源码:

# -*- coding: utf-8 -*-
# !/usr/bin/python
import re
import os
import os.path
import time
import gzip
import sys'''
How to use it?
as_tomba.py tombstone_file_path symbol_file_path
out file :
./tombstone_out.txt
'''
tombstone_file_path = sys.argv[1]
symbols_dir_path = sys.argv[2]def get_filePath_fileName_fileExt(filename):(filepath,tempfilename) = os.path.split(filename);(shotname,extension) = os.path.splitext(tempfilename);return filepath,shotname,extensiondef get_process_pid_name(filename):f = open(filename)for line in f:pattern = re.compile(r"pid:\s([0-9]+?),.+>>> (.+?) <<<")rst = pattern.search(line)if rst :pid = rst.group(1)name = rst.group(2).lstrip('/').replace('/','#')return pid,namereturn "null","null"def tomba_dir(ptombstone_file_dir,psymbols_dir_path):for file_name in os.listdir(tombstone_file_path):target_file = os.path.join(tombstone_file_path,file_name)tomba_file(target_file,symbols_dir_path)def tomba_file(ptombstone_file_path,psymbols_dir_path):psymbols_dir_path = psymbols_dir_path.rstrip('/')(pid,pname) = get_process_pid_name(ptombstone_file_path)f = open(ptombstone_file_path);(file_p,file_s,file_e) = get_filePath_fileName_fileExt(ptombstone_file_path)out_file_name = file_s+"_"+pid+"_"+pname+".out"fp = open(file_p+'/'+out_file_name,'a+')fp.truncate()for line in f:line = line.lstrip()line = line.strip('\n')if  line.startswith("stack:"):breakelse:# pattern = re.compile('(#[0-9]{2})(?#调用栈帧数)\s+pc\s+([0-9a-z]{16})(?#pc地址)\s(.+?)\s')# 64位和32位机器的pc地址长度不同,64位为16位PC地址,32位为8位PC地址pattern = re.compile('(#[0-9]{2})(?#调用栈帧数)\s+pc\s+([0-9a-z]*)(?#pc地址)\s(.+?)\s')rst = pattern.search(line)if rst:symbol_path = psymbols_dir_path + rst.group(3).strip()shift_code = rst.group(2)print lineprint symbol_pathprint shift_codeprint '\n'analysis_result = tomba_so(symbol_path,shift_code)fp.write(line)fp.write(analysis_result)fp.write('\n')f.flush()def tomba_so(symbol_so_path,shift_code):if(os.path.exists(symbol_so_path)):cmd_line = "addr2line -Cfe %s %s" %(symbol_so_path,shift_code)f = os.popen(cmd_line)result = f.read()return resultelse:return "no symbol file!!!"if os.path.isdir(tombstone_file_path):print(tombstone_file_path + " is a dir")tomba_dir(tombstone_file_path,symbols_dir_path)
elif os.path.isfile(tombstone_file_path):print(tombstone_file_path + " is a file")tomba_file(tombstone_file_path,symbols_dir_path)
else:print("Wrong Tombstone File Name!")sys.exit()

[Python] Native Crash Addr2line 自动解析Tombstone文件脚本相关推荐

  1. Python 自动化教程(5) : 自动生成Word文件

    系列教程: Python 自动化教程(1) 概述,第一篇 Excel自动化 Python 自动化教程(2) : Excel自动化:使用pandas库 Python 自动化教程(3) : 自动生成PPT ...

  2. Python 自动化教程(4) : 自动生成PPT文件 Part 2 (干货)

    系列教程: Python 自动化教程(1) 概述,第一篇 Excel自动化 Python 自动化教程(2) : Excel自动化:使用pandas库 Python 自动化教程(3) : 自动生成PPT ...

  3. python爬虫之创建和解析xlm文件

    python爬虫之创建和解析xlm文件: 1.python代码创建xlm字符串(使用xml库方法): import xml.etree.ElementTree as ET bookstore = ET ...

  4. python中利用lxml模块解析xml文件报错XMLSyntaxError: Opening and ending tag mismatch

    今天在代码中第一次使用lxml解析xml文件时出错了, XMLSyntaxError: Opening and ending tag mismatch: keyEffectiveDate line 2 ...

  5. python 使用os模块自动打开本地文件

    import os os.system('path')   #path为文件路径,本目录下可直接写文件名os 为本地模块不需再行安装 运行环境:python3.6 os.system('path')  ...

  6. 【Android 逆向】使用 Python 代码解析 ELF 文件 ( PyCharm 中创建 Python 程序 | 导入 ELFFile 库 | 解析 ELF 文件 )

    文章目录 一.PyCharm 中创建 Python 程序 二.导入 ELFFile 依赖库 三. 解析 ELF 文件 四. 博客源码 一.PyCharm 中创建 Python 程序 在 PyCharm ...

  7. python带命令行参数解析的文件遍历脚本(找出文件名长度大于某值的文件)

    背景 复制一个目录时,提示有个文件名太长未能复制成功,然后忘记是哪个了,现在要靠脚本把它找出来. 代码 #!/usr/bin/pythonimport getopt import os import ...

  8. Python基础学习:svn导出差异文件脚本

    由于是刚接触python不久,所以很多都不是很熟练,只能是用到什么查点什么.所以如果有什么bug或者不严谨的语法或其他,希望各位看客指正. 鉴于公司的平台研发部门需求想直接把svn中的差异代码导出并打 ...

  9. 关于如何使用Python写一个开机自动认证校园网的脚本程序

    有的学校有那个无感认证,有的学校没有,这个时候就可以自己动手丰衣足食,我学校就是只有手机才有无感认证,PC端是没有的,所以我就自己写了一个.(没有编程经验也可以,照着我的写就行) 首先,你需要安装好P ...

最新文章

  1. Java开发中业务层入参校验详细解析
  2. 免费的python课程-自学Python的10门免费课程,已学完
  3. Selenium_python自动化环境搭建篇
  4. 中柏平板触摸驱动_一文总览2019年最新最全的工业平板电脑定制化服务
  5. post方法就返回了一个string字符串前台怎么接_LoadRunner脚本编写教程Getamp;Post
  6. 使用MSIL 汇编程序 (Ilasm.exe) 2 强签名
  7. php工程师各大公司要求
  8. delphi模拟论坛登录
  9. qq互联登录授权php配置,网站接入QQ登录(QQ互联)php版的流程
  10. 获取中文拼音或拼音首字母方法
  11. 计算机usb接口管理软件,大势至电脑USB端口管理软件
  12. 图像空间和灰度分辨率
  13. 笔记本电脑如何同时上内外网(通过usb外接网卡实现虚拟机连外网)
  14. 四川省科学技术奖申报条件和18市补助
  15. auto CAD 二次开发 c#.net 之JIG画多段线(polyline)
  16. Android studio2.3版本 用小米手机无法调试,用模拟器正常调试。Application Installation Failed
  17. 学习matlab(七)——符号计算
  18. 医学图像分割知识点总结
  19. Python密码库Cryptography探究学习
  20. OneKeyGhost工具进行备份还原windows操作系统

热门文章

  1. 保研日记--中国人民大学信息学院(人大信院)
  2. 在线数学函数图形和在线数据结构演示
  3. 114、数据库,核心价值是持久层和数据准确性,复杂的事情不要干
  4. IBM任命联想老将陈旭东为大中华区总经理
  5. 1036 Boys vs Girls (25 分)
  6. 深度学习 动量公式推导(moment动量)
  7. c语言训练题:关于张三李四王五说谎的问题(此处用javascript实现)
  8. 免费的小学英语软件有测试题,小学阶段英语语法总结(含练习题)
  9. it's和its有什么区别?
  10. 如何正确学习JavaScript