Crash Dump自动化分析的尝试

本文介绍了一款名为DumpDigger的新型自动崩溃日志分析工具,通过利用cdb/windbg的!analyze命令,提高了分析效率并实现了自动化报告生成。该工具结合了数据库管理和邮件自动发送功能,显著减少了人工干预,提升了工作效率。

其实另一个产品线的同事已经开发了自动分析的工具,但是非常不好用。同组的同事花了好几天也没能应用到目前的产品上来。
后来我接手了Crash Dump分析的工作,也了解了一下那个工具(称为A),它还需要调用另一个工具(称为B),过程繁琐,并且几乎无法维护和扩展。可以看出B也是尝试进行Crash Dump自动分析的结果,但需要人工干预和交互,算个半自动工具。一个C#的WinForm程序,仅通过windbg获得调用栈,然后自己实现一套本应由windbg来做的功能,当然,效果肯定不如windbg。因为B的维护不便,有人开发了A,作为B的补充,使得分析工作可以自动化,但是受限于B,做的还不够好。
A+B的组合还有个致命的问题,dump只能一个一个的分析,慢!我也是个懒人,每天大把的时间花在不顺手的工具上显然让我不爽。于是利用我之前的crash分析经验,用Python写了一个新的工具DumpDigger。
大致思路就是利用 cdb/windbg的!analyze命令获得crash dump的分析结果,用FAILURE_BUCKET_ID作为问题标识,取出关键字段的信息保存到数据库。运行时会启动多个进程同时分析,这样虽然!analyze比k 1000慢不少,但仍然能获得几倍的效率提升。最后,待指定的dump都分析完成,会根据数据库中保存的信息生成详尽的分析报告,报告url通过邮件自动发送。
基于Django写了分析报告的展示功能。DumpDigger的分析报告为XML格式,同样保存在数据库中,展示时通过xslt转换为html。用Twitter的Bootstrap写前端页面确实很轻松,最终的实现效果还不错,得到大家的好评。将分析脚本添加到计划任务中后,每天自动分析、发布日报,完全不需要人工干预,我也终于从机械的劳动中解放了。
下一步的目标是将DumpDigger与缺陷跟踪系统结合起来,用于跟踪发布版本的crash问题。

使用 Windbg 详细分析内存转储文件(dump)是排查 C++ 软件异常的重要手段,尤其在无法通过源码调试的情况下,静态分析 dump 文件能够帮助定位崩溃原因、查看调用堆栈、检查变量状态等。以下是分析 dump 文件的一般步骤及要点。 ### 1. 准备工作 在开始分析前,需确保具备以下条件: - **Windbg 已安装**:可以从微软官网下载安装 Windows SDK 或单独安装 Windbg。 - **符号文件(PDB)可用**:确保被分析程序的符号文件(.pdb)存在,并配置好符号路径,以便 Windbg 能正确加载符号信息[^2]。 - **Dump 文件完整**:确保 dump 文件是完整内存转储(Full Dump),而非小型转储(Mini Dump),以便获取完整的堆栈和内存信息。 ### 2. 加载 Dump 文件 打开 Windbg,选择 **File > Open Crash Dump**,加载目标 dump 文件。加载完成后,Windbg 会自动显示异常发生时的简要信息。 ### 3. 设置符号路径 为确保 Windbg 能正确解析函数名和变量名,需设置符号路径。例如: ```shell .sympath SRV*C:\Symbols*http://msdl.microsoft.com/download/symbols ``` 如果本地有程序的符号文件,可以添加本地路径: ```shell .sympath+ C:\MyApp\Symbols ``` 最后执行 `.reload` 命令刷新符号[^2]。 ### 4. 查看异常信息 使用命令 `!analyze -v` 可以详细分析异常信息,输出异常类型、发生异常的模块、调用堆栈等信息。该命令会尝试定位异常源头,并提供调试建议[^1]。 ### 5. 查看调用堆栈 使用 `k` 命令查看当前线程的调用堆栈,确认异常发生时的函数调用路径。若堆栈中包含未解析的地址,可能需要检查符号路径是否配置正确。 ```shell k ``` 若需查看更详细的堆栈信息,包括参数和局部变量,可使用: ```shell kb ``` ### 6. 定位异常代码位置 根据异常地址,使用 `ln <address>` 命令查找对应的函数名和源码行号,从而定位到具体的代码位置。例如: ```shell ln 00007ff6`12345678 ``` 若符号信息完整,该命令会显示函数名、文件名及行号信息[^1]。 ### 7. 查看变量值 在定位到异常代码位置后,可以使用 `dv` 命令查看当前作用域内的局部变量值,帮助判断是否因变量值异常导致崩溃。例如: ```shell dv ``` 对于全局变量或特定内存地址的变量,可使用 `dd`、`dc` 等命令查看内存内容: ```shell dd myVariableAddress ``` ### 8. 检查堆内存状态 若怀疑异常与堆内存有关,可使用 `!heap` 命令查看堆的分配状态,检查是否存在内存泄漏或非法访问: ```shell !heap -s ``` 该命令会列出所有堆的状态信息,包括已分配和空闲的内存块。 ### 9. 检查线程信息 使用 `~` 命令查看所有线程的状态,切换线程上下文进行分析: ```shell ~ ``` 切换到特定线程后,可再次使用 `k` 或 `kb` 查看该线程的调用堆栈: ```shell ~2s k ``` ### 10. 使用扩展命令辅助分析 Windbg 提供了丰富的扩展命令,如 `!clrstack`(用于 .NET 程序)、`!analyze -v`(自动分析异常)等,可根据程序类型选择使用。 ### 示例分析流程 假设 dump 文件显示异常发生在 `MyFunction` 函数中,首先使用 `!analyze -v` 查看异常详情,接着使用 `k` 查看调用堆栈,确认调用路径。使用 `ln` 定位到源码行号后,使用 `dv` 查看局部变量值,发现某指针为 `NULL` 导致访问异常。通过 `dd` 查看该指针指向的内存区域,确认其未被正确初始化。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值