对计算机软件系统崩溃原因进行自动分析的方法

文档序号:6386111阅读:1192来源:国知局
专利名称:对计算机软件系统崩溃原因进行自动分析的方法
技术领域
本发明涉及计算机软件系统维护领域,尤其涉及一种对计算机软件系统崩溃原因
进行自动分析的方法。
背景技术
计算机的软件系统在运行过程中,会因为各种未知因素而产生异常,最终造成应 用程序崩溃或操作系统蓝屏,崩溃分析技术是指,对软件系统运行出错后生成的崩溃转储 文件(dump)进行分析和统计,并从中找出崩溃发生时的地址及其相关代码行,从而为解决 软件系统故障提供可信的依据。目前大多数已知的崩溃分析仅仅实现了崩溃文件的收集和 异常点的统计(利用的是软件系统崩溃时候的异常指针实现),而且均未提供针对系统蓝 屏以后的内核态崩溃转储文件的分析功能。

发明内容
本发明的目的是克服现有技术中的不足,提供一种对计算机软件系统崩溃原因进 行自动分析的方法,使用该方法可以自动对崩溃转储文件进行分析,并且获取崩溃函数和 崩溃模块,进而获知多项具体的崩溃信息,便于对各种不同崩溃信息的统计。
为了实现上述目的,采用以下技术方案 对计算机软件系统崩溃原因进行自动分析的方法,其包括如下步骤
a、打开崩溃转储文件; b、分别检索每个处理器每个线程的堆栈信息,对于用户态崩溃转储文件寻找用户 态的异常错误触发函数;对于内核态崩溃转储文件寻找内核态的异常错误触发函数;
c、根据搜索到的异常错误触发函数,检查异常发生时刻的上一个调用函数,如果 这个调用函数是一个有效的函数名,则暂定该调用函数为崩溃函数,把该调用函数隶属的 模块暂定为崩溃模块; d、根据获得的崩溃函数和崩溃模块获取崩溃信息,并将崩溃信息存储至数据库。 进一步的技术方案是, 在步骤a和步骤b之间还包括步骤al : al 、给崩溃转储文件进行唯一命名。 再进一步的技术方案是, 在步骤al和步骤b之间还包括步骤a2 : a2、加载调试符号文件。 上述方法利用Windows操作系统提供的调试机制,自动对崩溃转储文件中保存的
崩溃发生时的内存数据进行分析,并回溯出函数调用序列、寄存器数值、崩溃发生时加载的
模块信息、崩溃发生的地址信息及其相关系统,从中找出导致崩溃发生的原因,可以为后续
的软件故障分析及软件质量评估提供可信的依据。本发明方法的主要优点为 1、基于Windows调试技术技术,把一系列的分析流程自动化,并根据分析结果进行自动取舍,智能选取分析操作命令,有效的解决了崩溃转储分析中对操作人员的技术要 求过高的问题。 2、支持一系列的崩溃分析规则,根据不同的崩溃流程,使用不同的规则进行分析。
3、支持针对系统蓝屏以后的内核态崩溃转储文件的分析能够直接定位到具体的 崩溃函数、代码行号、崩溃现场的堆栈数据等内容。
具体实施例方式
本发明的方法的原理是基于Windows调试技术及其相应的调试API。 Windows调
试技术内置在操作系统内核里面,对外提供了一系列的Windows API和组件包。本发明利
用了 Windows调试技术提供的组件包Debugging Tools for Windows (以下简称WinDBG)
里面提供的Windows调试引擎,对崩溃转储文件进行自动的分析。本发明方法本身针对的
对象是崩溃转储文件。崩溃转储文件的生成方法主要有以下一些 參Windows错误报告机制 MiniD卿WriteD卿Windows API 參读取崩溃进程的内存 參应用程序调试器 利用上述方法生成崩溃转储文件以后,就可以利用下面介绍的方法进行崩溃转储 的分析过程了。 对计算机软件系统崩溃原因进行自动分析的方法,其包括如下步骤
a、打开崩溃转储文件,检查文件的合法性和有效性;
al、给崩溃转储文件进行唯一命名以便后续文件的管理; a2、加载调试符号文件;调试符号文件是将被调试程序的二进制信息与源程序代 码联系起来的桥梁,调试符号文件中记录了变量、类型、函数定义、源代码行等信息。
a3、检查崩溃发生时刻的软件运行环境,对于x64系统,如果运行在WoW64环境下, 则进行32位-64位运行环境切换,否则不进行环境切换。 b、分别检索每个处理器每个线程的堆栈信息,对于用户态崩溃转储文件寻找用户 态的异常错误触发函数;对于内核态崩溃转储文件寻找内核态的异常错误触发函数;如果 没有找到异常错误触发函数,跳转到步骤c2。 c、根据搜索到的异常错误触发函数,检查异常发生时刻的上一个调用函数,如果 这个调用函数是一个有效的函数名,则暂定该调用函数为崩溃函数,把该调用函数隶属的 模块暂定为崩溃模块; cl、如果步骤c找到的崩溃模块或者崩溃函数属于信任模块列表,那么继续检查 步骤b中搜索到的异常错误触发函数所在崩溃发生线程的再上一个调用函数,直到所检查 到的调用函数及其所在的模块为非信任模块,把这个最后检查到的函数定为崩溃函数,该 崩溃函数隶属的模块记为崩溃模块。所说的信任模块列表中包含多个信任模块,这些信任 模块是指编程人员认为可以确定为不可能是导致系统崩溃的模块;如果该过程结束后没有 找到崩溃函数,转到步骤c3 ;如果找到崩溃函数,进入步骤d。 c2、根据寄存器的值获得崩溃地址、异常错误代码,然后根据崩溃地址,利用 Windows调试引擎提供的API和命令对崩溃转储文件进行原始调用栈分析,获取最近的崩溃模块和最近的一个调用函数,并把最近的一个调用函数记为崩溃函数,把这个函数隶属 的模块记为崩溃模块;如果该过程结束后没有找到崩溃函数,转到步骤c3 ;如果找到崩溃 函数,进入步骤d。 c3、对崩溃时候的崩溃地址进行反汇编,检查是否存在可以标识出崩溃函数的信 息,如果该过程结束后没有找到崩溃函数,转到步骤c4 ;如果找到崩溃函数,进入步骤d。
c4、那么将崩溃函数记录为未找到状态,把崩溃模块记录为异常发生时刻线程所 属的模块。 d、根据获得的崩溃函数和崩溃模块获取崩溃信息,并将崩溃信息存储至数据库。
目前已知用户态的异常错误崩溃触发函数如下,并会根据操作系统的更新而不断 的改变 kernel32. dll提供的UnhandledExc印tionFilter函数、kernel32. dll提供 的FatalAppExitW函数、ke潔132. dll提供的FatalAppExitA函数、ke潔132. dll提供 的RaiseException函数、kernelbase. dll提供的RaiseException函数、ntdll. dll提 供的NtRaiseHardError函数、ntdll. dll提供的NtRaiseExc印tion函数、ntdll. dll提 供的KiUserExc印tionDispatcher函数、CxxThrowExc印tion函数、ntdll. dll提供的 TppExc印tionFilter函数、ntdll. dll提供的TppWorkerpI騰rExc印tionFilter函数、 except—handler函数、exc印t—handler2函数、exc印t—handler3函数、report—failure函 目前已知内核态的异常错误崩溃触发函数如下,并会根据操作系统的更新而不断 的改变Windows内核提供的KeBugCheck、 KeBugCheckEx、 KeBugCheckEx2、 KiTrap、
DbgBreakPoint、 DbgUserBreakPoint、 ExpRaiseHardError、 ExpSystemErro:rHandle:r、
PoShutdownBugcheck、 KeBugCheck、 KiBugCheck函数。
步骤d中所述崩溃信息包括下列信息中的至少一种; 1)崩溃发生时间; 2)操作系统; 3)处理器数目和类型; 4)崩溃上下文进程名字; 5)崩溃模块名字; 6)异常代码和异常原因; 7)崩溃的指令地址和模块偏移地址; 8)崩溃模块路径信息; 9)崩溃模块文件版本信息、产品版本信息等能够标识文件属性的信息;
10)崩溃发生时候的各线程堆栈信息;
11)寄存器信息; 12)以及其他有助于进行崩溃统计的信息。 其中,第l)-3)中崩溃信息可以从崩溃转储文件中获得,而其他崩溃信息则需要 在获取崩溃函数和崩溃模块后才能获得。 上述步骤c2的具体过程是,利用调试引擎命令和API,获取崩溃线程的EBP寄存器指向的栈地址,然后利用调试引擎命令和API枚举原始调用栈信息,得出形如下面的列表
0239ff08 0239ff48
kernel32 ! He即Free+0x14












0239fef8 0239ffl0 0239ffl4 0239ffl8 0239fflc 0239ff20 0239ff24 0239ff28 0239ff2c 0239ff30 0239ff34 0239ff38 0239ff3c
75e79a26 01f4000Q
01ae4c08 582b040a 01af2868 01f425a8 0239ff80
kavevent+0x4c08
kavevent+0x12868
01ae5a53 0239ff70
kavevent+0x5353
然后从上到下,逐行检测是否有模块名称(模块名称形如kernel32 ! HeapFree+0x14),如果有,则检查这个模块是否是信任模块,如果是,则继续检查下一行。如 果不是信任模块,那么最先找到的一个模块就是崩溃模块,这个模块的偏移地址就是崩溃 地址。 下面分别针对内核态转出文件和用户态转储文件进行示例讲解。
内核态 我们会检查callstack里面类似nt ! KeBugCheck(内核态的异常错误触发函数) 的函数,例如下面的nt ! KeBugCheckEx,如果发现有这个函数,那么我们会往下检查堆栈 调用, 00 ae9c01d8 8054c583 000000c2 00000007 00000cd4nt ! KeBugCheckEx+Oxlb 01 ae9c0228 ba623392 e39c8428 ExFreePoolWithTag+0x2a3 02 ae9c0244 ba6230f8 e3a89008 c0000001 DeleteProcessObject+0x52[e:\build\src\kavprocessm. c@1416]
03 ae9c0254 ba623肌0 e3a89008 e3a89008 KxEReleaseProcessObject+0x58
[e:\build\src\kavprocessm. c@1308]
04 ae9c0268 ba623d96 00000d90 KxERemoveProcessObject+Oxb0
[e:\build\src\kavprocessm. c@1791]
05 ae9c02b0 ba7481bl rocessNotifyRoutine+0x276
[e:\build\src\kavprocessm. c@1953]
00000000 OOOOOOOOnt !
ae9c0268kavpm !
01000064kavpm !
ba752e00kavpm ! KxECreateP
06 ae9c02c8 805d2b60 00000d90 OOOOOdbO OOOOOOOOkavuty ! StubCreat
eProcessNotifyRoutine+0x61 [e:\build\build\src\kavutynr. c船O] 07 ae9c02ec 805d3672 00000001 00000008 87ff7cd0nt ! PspExitProcess+0x5e 例如上面的第OO行,触发了一个异常函数nt ! KeBugCheckEx,那么我们会检索 后面的堆栈调用,由于nt模块属于信任模块,所以01行被忽略,检查02行的时候,kavpm 属于非信任模块,因此kavpm被记做崩溃模块,kavpm里面的DeleteProcessOb ject函数被 记做崩溃函数。崩溃地址为kavpm! DeleteProcessOb ject+0x52。对应的具体代码行是 e:\build\src\kavprocessm. c文件的第1416行代码。nt是nt内核的縮写,在不同的环境 下面可會g是ntosktrnl. exe、 ntkrnlmp. exe等不同的文件名。在内核态里面,除了常见的KeBugCheck、 KeBugCheckEx、 KeBugCheckEx2、 KiTr即 等常见的异常错误触发函数,还有类似的一些变形,例如KiTr即OO等。
用户态 崩溃转储里面的callstack形如下面的样子,kernel32 ! RaiseExc印tion是一 个异常错误触发函数,而调用RaiseExc印tion的也是一个在列表里面的异常错误触发函 数—CxxThrowExc印tion。我们枚举的时候,会把00行和01行过滤掉,然后发现02行是 kastraydll不是信任模块,因此记做崩溃模块,由于崩溃模块缺乏符号文件,因此无法定位 函数名和代码行,只能给出崩溃的偏移地址kastraydll+0x2acd7 00 016c56e8 01548e69 e06d7363 00000001 00000003kernel32 ! RaiseExc印tion+0x53 01 016c5720 0144acd7 016c5734 0145bad4 01435c2amsvcr80—1520000 ! —CxxThrowExc印tion+0x46 [f:\sp\vctools\crt_bld\self_x86\crt\prebuild\eh\throw. cpp@161] 02 016c572c 01435c2a 8007000e 01435c64
OOOOOOOOkastraydll+0x2acd7 03 016c5730 8007000e 01435c64 00000000 016c577ckastraydll+0xl5c2a04 016c5734 01435c64 00000000 016c577c 016cfddc 0x8007000e05 016c5738 00000000 016c577c 016cfddc
01466758kastraydll+0xl5c64 以上实施例仅用以说明而非限制本发明的技术方案。不脱离本发明精神和范围的 任何修改或局部替换,应涵盖在本发明的权利要求范围当中。
权利要求
对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,包括如下步骤a、打开崩溃转储文件;b、分别检索每个处理器每个线程的堆栈信息,对于用户态崩溃转储文件寻找用户态的异常错误触发函数;对于内核态崩溃转储文件寻找内核态的异常错误触发函数;c、根据搜索到的异常错误触发函数,检查异常发生时刻的上一个调用函数,如果这个调用函数是一个有效的函数名,则暂定该调用函数为崩溃函数,把该调用函数隶属的模块暂定为崩溃模块;d、根据获得的崩溃函数和崩溃模块获取崩溃信息,并将崩溃信息存储至数据库。
2. 根据权利要求1所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,所述用户态异常错误触发函数包括kernel32. dll提供的UnhandledExc印tionFilter函数、kernel32. dll提供的FatalAppExitW函数、kernel32. dll提供的FatalAppExitA函数、kerne132. dll提供的RaiseExc印tion函数、kernelbase. dll提供的RaiseExc印tion函数、ntdl1. dll提供的NtRaiseHardError函数、ntdl1. dll提供的NtRaiseExc印t ion函数、ntdll. dll提供的KiUserExc印tionDispatcher函数、CxxThrowExc印tion函数、ntdl1. dll提供的TppExc印tionFilter函数、ntdl1. dll提供的TppWorkerpI騰rExc印tionFilter函数、exc印t—handler函数、exc印t—handler2函数、exc印t—handler3函数、r印ort—failure函数。
3. 根据权利要求1所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,所述内核态异常错误触发函数包括Windows内核提供的KeBugCheck、 KeBugCheckEx、KeBugCheckEx2、 KiTr邻、DbgBreakPoint、 DbgUserBreakPoint、 ExpRaiseHardError、ExpSystemErrorHandler、 PoShutdownBugcheck、 KeBugCheck、 KiBugCheck函数。
4. 根据权利要求1至3中任意一项所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤a和步骤b之间还包括步骤al :al、给崩溃转储文件进行唯一命名。
5. 根据权利要求4所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤al和步骤b之间还包括步骤a2 :a2、加载调试符号文件。
6. 根据权利要求5所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤a2和步骤b之间还包括步骤a3 :a3、检查崩溃发生时刻的软件运行环境,对于x64系统,如果运行在WoW64环境下,则进行32位-64位运行环境切换,否则不进行环境切换。
7. 根据权利要求6所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤c和步骤d之间还包括步骤cl :cl、如果步骤c找到的崩溃模块或者崩溃函数属于信任模块列表,那么继续检查步骤b中搜索到的异常错误触发函数所在崩溃发生线程的再上一个调用函数,直到所检查到的调用函数及其所在的模块为非信任模块,把这个最后检查到的函数定为崩溃函数,该崩溃函数隶属的模块记为崩溃模块。
8. 根据权利要求1至3中任意一项所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤c和步骤d之间还包括步骤c2 :c2、如果没有找到异常错误触发函数,则根据寄存器的值获得崩溃地址、异常错误代码,然后根据崩溃地址,利用Windows调试引擎提供的API和命令对崩溃转储文件进行原始调用栈分析,获取最近的崩溃模块和最近的一个调用函数,并把最近的一个调用函数记为崩溃函数,把这个函数隶属的模块记为崩溃模块。
9. 根据权利要求8所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤c2和步骤d之间还包括步骤c3 :c3、如果步骤c2中未找到崩溃函数,则对崩溃时候的崩溃地址进行反汇编,检查是否存在可以标识出崩溃函数的信息。
10. 根据权利要求9所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤c3和步骤d之间还包括步骤c4 :c4、如果步骤c3还未找到崩溃函数,那么将崩溃函数记录为未找到状态,把崩溃模块记录为异常发生时刻线程所属的模块。
11. 根据权利要求7所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,在步骤cl和步骤d之间还包括步骤c5 :C5、如果步骤cl中未找到崩溃函数,则对崩溃时候的崩溃地址进行反汇编,检查是否存在可以标识出崩溃函数的信息。
12. 根据权利要求1或2或3所述的对计算机软件系统崩溃原因进行自动分析的方法,其特征在于,步骤d中所述崩溃信息包括下列信息中的至少一种;1) 崩溃发生时间;2) 崩溃上下文进程名字;3) 崩溃模块名字;4) 操作系统;5) 处理器数目和类型;6) 异常代码和异常原因;7) 崩溃的指令地址和模块偏移地址;8) 崩溃模块路径信息;9) 崩溃模块文件版本信息、产品版本信息等能够标识文件属性的信息;10) 崩溃发生时候的各线程堆栈信息;11) 寄存器信息。
全文摘要
本发明涉及一种对计算机软件系统崩溃原因进行自动分析的方法。对计算机软件系统崩溃原因进行自动分析的方法,其包括如下步骤a、打开崩溃转储文件;b、分别检索每个处理器每个线程的堆栈信息,对于用户态崩溃转储文件寻找用户态的异常错误触发函数;对于内核态崩溃转储文件寻找内核态的异常错误触发函数;c、根据搜索到的异常错误触发函数,检查异常发生时刻的上一个调用函数,如果这个调用函数是一个有效的函数名,则暂定该调用函数为崩溃函数,把该调用函数隶属的模块暂定为崩溃模块;d、根据获得的崩溃函数和崩溃模块获取崩溃信息,并将崩溃信息存储至数据库。上述的优点是可实现对软件系统崩溃原因的自动分析。
文档编号G06F11/36GK101719090SQ20091021434
公开日2010年6月2日 申请日期2009年12月25日 优先权日2009年12月25日
发明者张康宗, 张强, 罗勇, 郑有胜 申请人:珠海市君天电子科技有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1