处理minidump文件用到的“工具”的分享

news/2024/11/24 13:34:38/

前言

最近崩溃平台有BUG,native的崩溃堆栈解析不出来,只能自己线下人肉解堆栈了。本着能善用工具提高工作效果的习惯,最终收获了如下的zshe脚本(方法)用于后续的工作,借此笔记跟大家分享与交流,供大家参考之

分享产物

// xxx.so是我关注出现崩溃的so

stackwalk=/Applications/Android\ Studio.app/Contents/plugins/android-ndk/resources/lldb/bin/minidump_stackwalk# for minidump
stackwalk=/Applications/Android\ Studio.app/Contents/plugins/android-ndk/resources/lldb/bin/minidump_stackwalk# for minidump
function dumpaddr() {${stackwalk} -s $1 | grep libxxx.so | head -n $2
}function adumpaddr() {${stackwalk} -s $1 | grep libxxx.so | head -n $2 | awk -F"+" '{print $2}' | xargs -I {} llvm-addr2line -p -f -C -e $3 {}
}

具体说明

首先我们回顾一下地址解析命令,即add2line。我的环境下配置的是这样的

$ type llvm-addr2line
llvm-addr2line is /Users/luo/Library/Android/sdk/ndk/23.0.7599858/toolchains/llvm/prebuilt/darwin-x86_64/bin/llvm-addr2line

add2line的输入是带有调试符号信息的so文件,还有我们想解析的崩溃堆栈地址,如下示例

$ llvm-addr2line -p -f -C -e xxx.so文件路径 0x3f80f 0x122c26 0xd1e 0x79a 0xd22 0xd22 0xd1e 0xd22 0xd1e 0x79a 0xd1e 0x3ffe5 0x746e5 0x11b4e2 0x3ffe5 0x11b4e2 0x8437b 0x7a7df 0x7e53f 0x79a 0x3ffe5 0x40417 0x11b4e2 0xdeefe

so文件可以下载到,然后我们需要利用minidump_stackwalk命令从dump文件读取崩溃堆栈信息,获取我们需要的那些崩溃地址(如下图红圈圈住的地址)
在这里插入图片描述
所以dumpaddr方法是过滤想要用的一批地址,需要调整第二个参数

$ /Applications/Android\ Studio.app/Contents/plugins/android-ndk/resources/lldb/bin/minidump_stackwalk -s d0c25ac8-c49b-4655-95573dbc-7af2c98d.dmp | grep libxxx.so | head -n 302  libxxx.so + 0x3f80f3  libxxx.so + 0x122c264  libxxx.so + 0xd1e7  libxxx.so + 0x79a8  libxxx.so + 0xd229  libxxx.so + 0xd22
10  libxxx.so + 0xd1e
11  libxxx.so + 0xd22
12  libxxx.so + 0xd1e
15  libxxx.so + 0x79a
16  libxxx.so + 0xd1e
18  libxxx.so + 0x3ffe5
19  libxxx.so + 0x746e5
21  libxxx.so + 0x11b4e2
23  libxxx.so + 0x3ffe5
25  libxxx.so + 0x11b4e2
26  libxxx.so + 0x8437b
27  libxxx.so + 0x7a7df
30  libxxx.so + 0x7e53f
32  libxxx.so + 0x79a
33  libxxx.so + 0x3ffe5
34  libxxx.so + 0x40417
36  libxxx.so + 0x11b4e2
37  libxxx.so + 0xdeefe
39  libxxx.so + 0x87d17
40  libxxx.so + 0x3f80f2  libxxx.so + 0xa6bbd4  libxxx.so + 0xa63935  libxxx.so + 0x10fc126  libxxx.so + 0x10fba1# 换方法调用
$ dumpaddr d0c25ac8-c49b-4655-95573dbc-7af2c98d.dmp 302  libxxx.so + 0x3f80f3  libxxx.so + 0x122c264  libxxx.so + 0xd1e7  libxxx.so + 0x79a8  libxxx.so + 0xd229  libxxx.so + 0xd22
10  libxxx.so + 0xd1e
11  libxxx.so + 0xd22
12  libxxx.so + 0xd1e
15  libxxx.so + 0x79a
16  libxxx.so + 0xd1e
18  libxxx.so + 0x3ffe5
19  libxxx.so + 0x746e5
21  libxxx.so + 0x11b4e2
23  libxxx.so + 0x3ffe5
25  libxxx.so + 0x11b4e2
26  libxxx.so + 0x8437b
27  libxxx.so + 0x7a7df
30  libxxx.so + 0x7e53f
32  libxxx.so + 0x79a
33  libxxx.so + 0x3ffe5
34  libxxx.so + 0x40417
36  libxxx.so + 0x11b4e2
37  libxxx.so + 0xdeefe
39  libxxx.so + 0x87d17
40  libxxx.so + 0x3f80f2  libxxx.so + 0xa6bbd // 这里是其它线程的调用堆,所以我们调过调整 方法的第二个参数来示作过滤4  libxxx.so + 0xa63935  libxxx.so + 0x10fc126  libxxx.so + 0x10fba1

再加上 head -n $2 | awk -F"+" '{print $2}
就是截出地址,然后通过xargs命令把地址参数交给add2line解析出对应函数行数信息

具体的使用就是CD到dump文件目录
先dumpaddr然后ctrl + a ,输按a 再ctrl + e ,再输入so的路径

# luo@ ericluodeMacBook-Pro-2 in ~/Downloads/d0c25ac8-c49b-4655-95573dbc-7af2c98d_2 [15:56:51]
$ dumpaddr d0c25ac8-c49b-4655-95573dbc-7af2c98d.dmp 262  libxxx.so + 0x3f80f3  libxxx.so + 0x122c264  libxxx.so + 0xd1e7  libxxx.so + 0x79a8  libxxx.so + 0xd229  libxxx.so + 0xd22
10  libxxx.so + 0xd1e
11  libxxx.so + 0xd22
12  libxxx.so + 0xd1e
15  libxxx.so + 0x79a
16  libxxx.so + 0xd1e
18  libxxx.so + 0x3ffe5
19  libxxx.so + 0x746e5
21  libxxx.so + 0x11b4e2
23  libxxx.so + 0x3ffe5
25  libxxx.so + 0x11b4e2
26  libxxx.so + 0x8437b
27  libxxx.so + 0x7a7df
30  libxxx.so + 0x7e53f
32  libxxx.so + 0x79a
33  libxxx.so + 0x3ffe5
34  libxxx.so + 0x40417
36  libxxx.so + 0x11b4e2
37  libxxx.so + 0xdeefe
39  libxxx.so + 0x87d17
40  libxxx.so + 0x3f80f# luo@ ericluodeMacBook-Pro-2 in ~/Downloads/d0c25ac8-c49b-4655-95573dbc-7af2c98d_2 [15:56:55]
$ adumpaddr d0c25ac8-c49b-4655-95573dbc-7af2c98d.dmp 26 libxxx.so的具体路径
后面的崩溃栈函数信息没有贴出来

说明:

# 这个逻辑可以得到一串地址,xargs把前面的一列地址转成了一行,可以copy这一行内容,然后手动输入add2line so地址 paste的也是可以的
${stackwalk} -s $1 | grep libxxx.so | head -n $2 | awk -F"+" '{print $2}' | xargs

相关文章

  • 之前写的《breakpad的学习与使用笔记》

http://www.ppmy.cn/news/574797.html

相关文章

简单分析minidump

转载自:http://91dengdeng.cn/2019/05/07/%E7%AE%80%E5%8D%95%E5%88%86%E6%9E%90minidump-1/ 简单分析minidump(1) 有了前几节的准备工作,我们的程序已经可以自动捕获异常了,那么我们开始通过windbg来分析dump解决实际问题。先从简单入手&am…

Minidump 文件分析工具

Minidump 文件分析工具 microsoft, 解决问题, 计算机, 操作系统, 存储器 许多人可能经常遇见计算机频繁重新启动的问题,总是难于解决问题,最后只能重新安装操作系统.我介绍的这篇文章应该能解决许多人这样的痛苦.   通常在荡机…

异常处理与MiniDump详解(4) MiniDump

异常处理与MiniDump详解(4) MiniDump write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 一、 综述 总算讲到MiniDump了。 Dump有多有用我都无法尽数,基本上属于定位错误修复BUG的倚天剑。(日志可以算是屠龙刀)这…

操作系统——银行家算法的模拟与实现

一:实验题目 银行家算法的模拟与实现 二:实验目的 (1) 进一步了解进程的并发执行。 (2) 加强对进程死锁的理解,理解安全状态与不安全状态的概念。 (3) 掌握使用银行家算法避免死锁问题。 三、总体设计(含背景知识或基本原…

亚马逊云科技数据库市场份额提升迅速,合作伙伴和开发者生态系统为其赋能

对比常规的基础设施上云和应用上云,企业对于数据上云一直保持最为慎重的态度。不过也不是一成不变的,Gartner前不久公布的一组数据显示,在2022年全球数据库管理系统的市场份额排名中,作为纯云厂商的亚马逊云科技,超越了老牌传统数据库厂商甲骨文和微软,首次位居第一。 降低企业…

Android应用分身的实现和解析

1 背景 从去年下半年360奇酷手机发布后,国内的手机新品发布,都会提到应用分身、微信双开等类似概念,有一些第三方应用也以分身/双开作为亮点抢占市场,一时间分身类应用成为主流手机的一个必备功能。 在了解和比较了国内的分身…

Android应用分身功能介绍

作者 Steven.zhu 1 背景 从去年下半年360奇酷手机发布后,国内的手机新品发布,都会提到应用分身、微信双开等类似概念,有一些第三方应用也以分身/双开作为亮点抢占市场,一时间分身类应用成为主流手机的一个必备功能。 在了解和…

废旧手机秒变PHP服务,轻松拥有随身服务器

废旧手机秒变PHP服务,轻松拥有随身服务器 个人有一台360奇酷手机没有在使用,伊拉克成色,手机卡的一P食之无味弃之可惜的典范,于是想把这个安卓变为PHP服务器,并且装一个wordpress测试项目,说干就干。 需要…