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

本文介绍了如何利用zsh脚本和addr2line工具,自动化解析Android应用的崩溃堆栈信息,特别是在面对minidump_stackwalk命令无法解析的BUG时,提供了一个名为'dumpaddr'的函数,用于从dump文件中筛选出指定库的地址,并通过'adumpaddr'函数转换为函数行号,提高了崩溃分析的效率。

前言

最近崩溃平台有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文件,还有我们想解析的崩溃堆栈地址,如

### 修改 Minidump 文件的内容 Minidump 是一种轻量级的崩溃转储文件格式,通常用于捕获应用程序崩溃时的状态以便后续分析。由于其设计初衷并非支持直接修改内容,因此对 Minidump 文件进行更改需要一定的技巧。 #### 使用工具加载并解析 Minidump 可以利用调试器或其他专门的应用程序来打开和查看 Minidump 的内容。例如,可以通过 `WinDbg` 或者第三方工具如 `MinDumpView` 来读取其中的信息[^1]。这些工具能够提供关于进程状态、线程信息以及内存映射等内容的详细视图。 #### 利用 MiniDumpWriteDump API 创建自定义 Dump 如果目标是从头构建或者调整现有的 dump 数据,则可能需要用到 Windows 提供的 `MiniDumpWriteDump()` 函数。此函数允许开发者指定要保存到 minidump 中的具体部分(比如完整的内存还是仅限于特定区域)。此外,在调用过程中还可以传递回调函数指针以进一步控制写入过程中的行为,这涉及到 MINIDUMP_CALLBACK_INPUT 结构体所描述的相关输入参数[^2]。 对于更深入的操作来说,假如希望手动编辑已存在的二进制形式 minidump 文件而不是重新生成一个新的版本的话,那么就需要理解它的内部结构布局。然而需要注意的是这种做法风险较高因为任何错误都可能导致最终产物无法被正确解读。 #### 解析地址转换为源码位置 假设我们已经获取到了某些感兴趣的虚拟内存地址,并希望通过某种方式将其关联回原始代码的位置上。这里介绍了一种方法论即先提取出相关联的符号表项再借助 GNU 工具链下的 addr2line 实现反向查找定位功能[^3]。具体实现如下: ```bash head -n $2 | awk -F"+" '{print $2}' | xargs addr2line -e your_program_name ``` 上述脚本片段展示了如何自动化处理多个地址并将它们分别送至 addr2line 进行解码操作从而获得对应的函数名及其所在源文件行号等重要线索。 综上所述,虽然理论上可以直接操纵 minidump 文件本身但是推荐的做法要么基于官方API接口重做整个流程要么依赖成熟的外部解决方案来进行间接性的定制化需求满足工作。
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值