使用 python 自动化分析 CrashDump

作者:马卓 导语 :本文介绍了一下自动化分析CrashDump的方法

由于项目原因,需要批量分析CrashDump文件,正常的手动分析流程是:

  • 使用windbg载入CrashDump文件;
  • 等待文件分析完成;
  • 提取其中的信息;
  • 进行决策,如何处理;
  • 关闭CrashDump,继续下一个;

这种流程对于几个文件可能还不算什么,但是当面对成百上千个Dump文件时,效率就很低下了。因此我开始琢磨如何批量自动化的完成这个操作,这里我想到了pykd。

Pykd是使用python编写的调用windbg api的工具。按照官方文档的说法,pykd有两种模式:

一种是作为windbg的插件。相信经常使用windbg的同学应该会很熟悉。

而另一种模式则是作为独立的python模块存在的。这为我们摆脱windbg实现自动化提供了可能。

当作为python独立模块时,安装也很简单只需要运行以下命令即可: Python -m pip install pykd Pykd模块会自带dbgeng.dll这个模块,因此不再需要单独安装windbg。

下面来说一下如何利用这个模块实现自动化。这里涉及到两个api:pykd.loadDump()和pykd.closeDump()。顾名思义,loadDump就是用来载入crashdump文件的,closeDump是用来关闭crashdump文件的。这里需要强调一下closeDump的用法,pykd在loadDump以后,并没有为这个crashdump文件创建相应的对象,而仅仅只是返回了一个id,而pykd的各个命令中并没有区分多个crashdump文件的参数,因此我们在载入多个文件后再获得其他文件的信息,因此这里我们需要在获得文件信息后,调用closedump方法关闭文件,一来防止内存泄漏,二来防止多次载入信息以后造成数据的混淆。

下面是实现的代码,比较简单,大家可以自己添加代码,打印自己关心的信息,也可以通过pykd.dbgCommand()方法执行自己的命令。

_author__="hyperchem"
import pykd
import sys
import os

def help():
    print "autoDumpAnalyzer v0.1 by HyperChem"
    print "autoDumpAnalyzer.py <dir> ;Analyze crashdump in dir"
def printDumpInfo(name):
    id=pykd.loadDump(name)
    print "Exception IP:"+hex(pykd.getIP())
    print "Registers:"
    print pykd.dbgCommand("r")
    bcdata=pykd.bugCheckData()
    str_bcdata='BugCheck '
    for bb in bcdata:
        str_bcdata+=hex(bb)
        str_bcdata+=","
    print "BugCheckData:"+str_bcdata
    pykd.closeDump(id)
def main():
    if len(sys.argv)!=2:
        help()
    else:
        dir=sys.argv[1]
        ll=len(dir)
        if dir[ll-1:]!="\\":
            dir+="\\"
        for dirpath,dirnames,filenames in os.walk(dir):
            for file in filenames:
                if ".dmp" in file.lower():
                    print "Analyzing CrashDump:"+file
                    Fulldir=dir+file
                    printDumpInfo(Fulldir)
                    print "*************************************"
if __name__=='__main__':
   main()

下面是效果图:

参考链接:

Pykd 文档: https://pykd.codeplex.com/wikipage?title=PYKD%200.2.%20Documentation&referringTitle=Documentation

Pykd API: https://pykd.codeplex.com/wikipage?title=PYKD%200.3.%20API%20Reference&referringTitle=Documentation

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

前端性能优化-雅虎军规35条

合并图片(如css sprites,内置图片使用数据)、合并CSS、JS,这一点很重要,但是要考虑合并后的文件体积。

1035
来自专栏ytkah

wordpress站内搜索结果页URL伪静态如何操作

  站内搜索页面的优化一直被很多人忽略,只是按cms自带的默认设置,其实搜索结果页是一块宝藏,url重写是提升的重要一步。之前我们写过帝国CMS搜索页伪静态实现...

2868
来自专栏偏前端工程师的驿站

前端翻译:Activating Browser Modes with Doctype

一、前言                           由于本人英语能力有限,译本内容难免有误,望各位指正!   本译文不含附录部分,请知悉。 二、译文内...

1957
来自专栏Java架构沉思录

再谈分布式ID生成方案

昨天沉思君分享了一篇关于分布式ID生成方案的文章《分布式ID常见解决方案》,文中介绍了几种常见的分布式ID生成方案,并讨论了其优缺点。刚好最近沉思君在看李艳鹏老...

1034
来自专栏Golang语言社区

设计Go API的管道使用原则

管道是并发安全的队列,用于在Go的轻量级线程(Go协程)之间安全地传递消息。总的来讲,这些原语是Go语言中最为称道的特色功能之一。这种消息传递范式使得开发者可以...

3506
来自专栏北京马哥教育

《linux下crontab的深入分析》

一)cron服务的介绍 cron是Linux系统下一个自动执行指定任务的程序. cron服务要通过命令启动和停止,在Linux上可以通过/etc/init.d/...

2725
来自专栏Urahara Blog

一条命令找出系统web路径

972
来自专栏FreeBuf

新型PPT钓鱼攻击分析(含gootkit木马详细分析)

1 概述 最近出现了一种新型的PPT钓鱼攻击方式,该种钓鱼攻击方式不需要宏就能实现执行powershell的功能,通过网络下载gootkit木马进行控制。 2 ...

2814
来自专栏用户1191492的专栏

JClouds的命令行界面

我已经使用JCloud(一种面向Java支持多种云的工具集)一年了。到目前为止,我已经在很多领域广泛地使用了JCloud,特别是在Fuse Eco...

2619
来自专栏Spark学习技巧

flink超越Spark的Checkpoint机制

同时,浪尖也在知识星球里发了源码解析的文章。spark streaming的Checkpoint仅仅是针对driver的故障恢复做了数据和元数据的Checkpo...

1682

扫码关注云+社区