不少迅雷用户都曾遇到过迅雷发生崩溃的情况,大多数人的第一反应是“懊恼不已”。

(我们遇到迅雷崩溃的反应就恰好相反:“太棒了!迅雷崩溃啦!”这意味着一个问题可以立即得到定位,如果问题产生的足够弱智,可能还会有人请客。)

  不过本文所要讲述的内容是,当崩溃发生后,某人“懊恼不已”时,还可以让你这个“高端用户”彰显高端之处。

什么是崩溃?

  简单的说,当你使用迅雷过程中,出现类似下图的提示窗口,告诉你“迅雷5出现问题,已被关闭”时,就表示迅雷程序发生了崩溃。

  程序之所以发生崩溃,往往都是代码执行过程中出现严重异常导致的。(程序运行过程中出现异常是不可避免的。)

  但是请注意,出现异常并不一定是代码本身的问题。不同计算机环境因素导致的异常也很常见。

因此我将崩溃分为三大类:

1、程序本身的BUG

【1.1、简单说就是程序本身有BUG】

2、环境因素导致的异常

【2.1、在感染病毒的机器上运行时,病毒注入进程后执行的某些操作导致异常。】

【2.2、与某些会注入进程的软件(例如杀毒软件、输入法)产生冲突。】

【2.3、某些软件修改了操作系统的某些系统库,导致程序调用系统库异常。】

【2.4、程序的某些操作被阻止。(例如权限问题,或杀毒软件拦截)】

3、二者兼具

【3.1、程序的某些BUG在某些特定的环境中才会触发(这种情况比较特殊,但不常见)】

  当然,本文的重点是“简单的分析崩溃”,对于不同的崩溃类型,仅作简单了解即可,接下来是重点。

如何分析崩溃?

  要分析崩溃,首先需要获得崩溃的“详细信息”

1、获得崩溃“详细信息”

  当崩溃发生时,在弹出的提示窗口上显示了简单的信息。

  这里我们只需要两处内容“特征、详细错误

  特征(用于识别崩溃):我们也称为“EID(Error ID)”,类似药品的批号,只要2个崩溃的EID前2个字段相符,即为同一个异常导致的崩溃。

  详细错误用于定位崩溃所有与本次崩溃有关的程序“堆栈、模块、线程”等信息都记录在此。

2、分析崩溃“详细信息”

(1)、完整的特征(EID)具有4个字段。

例如:25-032A0A4D-01F765DD-064ABE8D

  我们只需要前2个字段,即上面例子中的“25-032A0A4”,仅用于识别崩溃。

(当你看到又一个崩溃时,回忆一下以前是否见过这个EID,就知道是否是已知问题了。)

(2)、详细错误的内容非常多。我只讲我们用得着的,请看下面#号内的注解

—————————Exception———————————
thunder5(迅雷5) 5.9.12.1196  #产品名称及版本#
Process(PID:A3C) : D:\迅雷\Program\Thunder.exe  #主程序所在目录#

Microsoft Windows XP Service Pack 3 [Build 5.1.2600] #操作系统标识及版本#
Architecture : x86,ProcessorNum : 2  #CPU架构,CPU核心数量#
———————————–
Start Time : 2010-01-13 18:08:09 #启动时间#
Crash Time : 2010-01-13 18:11:09 #崩溃时间#
Crash Thread : D5C

Hash : 25-032A0A4D-01F765DD-064ABE8D #特征(EID)#
Type : Code[0xE06D7363]
Address : 0x7C812AFB

Context: EFLAG=0x00200206
EAX : 0x0012FCD0 EBX : 0x01017C28 ECX : 0x00000000 EDX : 0x00760524
EIP : 0x7C812AFB EBP : 0x0012FD20 ESP : 0x0012FCCC ESI : 0x0012FD60 EDI : 0x0012FD60
CS : 0x001B SS : 0x0023  DS : 0x0023 ES : 0x0023 FS : 0x003B GS : 0x0000

Call stack: #崩溃堆栈#
————————————-
0x7C812AFB kernel32.dll[00012AFB] :(E06D7363,00000001,00000003,0012FD54 [63 73 6D E0 01 00 00 00 03 00 00 00 54 FD 12 00])
0x7C359AED msvcr71.dll[00019AED] :(0012FDA0,25CABDC0,0177D308,01017C28 [A0 FD 12 00 C0 BD CA 25 08 D3 77 01 28 7C 01 01])
0x25C46A5E XLGUIDevEnv.dll[00046A5E] :(0177D45C,25C35EB3,01017C38,00000001 [5C D4 77 01 B3 5E C3 25 38 7C 01 01 01 00 00 00])
0x25C46C33 XLGUIDevEnv.dll[00046C33] :(0177D45C,00000001,0152B470,00000000 [5C D4 77 01 01 00 00 00 70 B4 52 01 00 00 00 00])
0x00403D4F Thunder.exe[00003D4F] :(00000001,0058AB88,005286AC,00000001 [01 00 00 00 88 AB 58 00 AC 86 52 00 01 00 00 00])
0x00406D83 Thunder.exe[00006D83] :(0058AB88,0058AB88,0012FF08,0040F20D [88 AB 58 00 88 AB 58 00 08 FF 12 00 0D F2 40 00])
0x0040ED18 Thunder.exe[0000ED18] :(0058AB88,0040F95B,0058AB88,0058AB88 [88 AB 58 00 5B F9 40 00 88 AB 58 00 88 AB 58 00])
0x0040F20D Thunder.exe[0000F20D] :(00000000,0002069C,7C80B741,0050AD98 [00 00 00 00 9C 06 02 00 41 B7 80 7C 98 AD 50 00])
0x006B2F3C MFC71u.dll[00032F3C] :(0000003F,000FF150,7FFDE000,8054C6ED [3F 00 00 00 50 F1 0F 00 00 E0 FD 7F ED C6 54 80])
0x7C817077 kernel32.dll[00017077] :(00000000,00000000,00000000,00000000 [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00])

Modules: #崩溃发生时程序加载的模块#
————————————-
Thunder.exe[ 00400000 ]D:\迅雷\Program\Thunder.exe[ 5.9.12.1196 (2009-11-30 22:52:32) ] size=2568192
MFC71u.dll[ 00680000 ]C:\WINDOWS\system32\MFC71u.dll[ 7.10.6101.0 (2009-07-12 08:51:44) ] size=1064960
kis.dll[ 01110000 ]C:\Program Files\Kingsoft\Kingsoft Internet Security\kis.dll[ 2009.6.15.929 (2009-06-15 16:43:23) ] size=249856
kwsui.dll[ 01190000 ]C:\Program Files\Kingsoft\Kingsoft Internet Security\webshield\kwsui.dll[ 2009.12.23.6 (2009-12-23 16:45:34) ] size=344064
xpsp2res.dll[ 0C300000 ]C:\WINDOWS\system32\xpsp2res.dll[ 5.1.2600.5512 (2008-04-14 01:39:24) ] size=5541888
MSOXMLMF.DLL[ 0CFC0000 ]C:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSOXMLMF.DLL[ 11.0.8164.0 (2007-04-14 06:22:39) ] size=53248
KMailOEBand.DLL[ 10000000 ]C:\Program Files\Kingsoft\Kingsoft Internet Security\KMailOEBand.DLL[ 2009.2.13.759 (2009-02-13 23:25:22) ] size=86016

以上有2个内容需要重点讲解

1、Call stack: #崩溃堆栈#

  【崩溃堆栈中记录的是“程序在崩溃时调用的堆栈”】(关于堆栈的概念,有兴趣的可以参考百度百科中的“堆栈”

  下面内容中我们看到有很多行,每行的格式基本是固定的。

  依次是:“相对地址 模块名称 绝对地址”后面的一长串就不用管了。“相对地址、绝对地址”都是开发人员用来定位代码的,我们只关注“模块名称”

  示例中标红的字段,就是崩溃发生时调用的模块,越靠上就越与崩溃发生的点越近,由于“msvcr71.dll、kernel32.dll”都属于系统库,出问题的可能性很低。

  那么原则就是:“从上往下找,直至找到第一个非系统库的模块。”

  我们看到3、4行中的“XLGUIDevEnv.dll”就是迅雷的模块,因此判断,是XLGUIDevEnv.dll的异常导致的崩溃。

Call stack: #崩溃堆栈#
————————————-
0x7C812AFB kernel32.dll[00012AFB] :(E06D7363,00000001,00000003,0012FD54 [63 73 6D E0 01 00 00 00 03 00 00 00 54 FD 12 00])
0x7C359AED msvcr71.dll[00019AED] :(0012FDA0,25CABDC0,0177D308,01017C28 [A0 FD 12 00 C0 BD CA 25 08 D3 77 01 28 7C 01 01])
0x25C46A5E XLGUIDevEnv.dll[00046A5E] :(0177D45C,25C35EB3,01017C38,00000001 [5C D4 77 01 B3 5E C3 25 38 7C 01 01 01 00 00 00])
0x25C46C33 XLGUIDevEnv.dll[00046C33] :(0177D45C,00000001,0152B470,00000000 [5C D4 77 01 01 00 00 00 70 B4 52 01 00 00 00 00])
0x00403D4F Thunder.exe[00003D4F] :(00000001,0058AB88,005286AC,00000001 [01 00 00 00 88 AB 58 00 AC 86 52 00 01 00 00 00])
0x00406D83 Thunder.exe[00006D83] :(0058AB88,0058AB88,0012FF08,0040F20D [88 AB 58 00 88 AB 58 00 08 FF 12 00 0D F2 40 00])
0x0040ED18 Thunder.exe[0000ED18] :(0058AB88,0040F95B,0058AB88,0058AB88 [88 AB 58 00 5B F9 40 00 88 AB 58 00 88 AB 58 00])
0x0040F20D Thunder.exe[0000F20D] :(00000000,0002069C,7C80B741,0050AD98 [00 00 00 00 9C 06 02 00 41 B7 80 7C 98 AD 50 00])
0x006B2F3C MFC71u.dll[00032F3C] :(0000003F,000FF150,7FFDE000,8054C6ED [3F 00 00 00 50 F1 0F 00 00 E0 FD 7F ED C6 54 80])
0x7C817077 kernel32.dll[00017077] :(00000000,00000000,00000000,00000000 [00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00])

2、Modules: #崩溃发生时程序加载的模块#

  【Modules(模块)中记录的是“程序崩溃时,进程中加载的所有模块”】

  但是如何方便的知道这些模块哪些是系统库,哪些不是系统库呢?

  当然如果你对系统库的熟悉程度较好,对此会很有帮助。

  如果你不熟悉,就要借助Modules列表查找了。

  同崩溃堆栈类似,模块列表的格式也是固定的。

  依次为“模块名称、文件路径、版本号、修改日期、文件大小”

(只要将堆栈中出现的模块名称复制后在列表中搜索一下,就可以看到模块对应的路径。)

  因为“\WINDOWS\system32\”路径下的文件多是系统文件

  而我们看见“XLGUIDevEnv.dll”位于“D:\迅雷\Program\XLGUIDevEnv.dll”那么这就是迅雷的文件了。

  同理,我们还在模块列表中看到了“kis.dll、kwsui.dll”从对应的目录判断,我们就能知道,该用户还安装了“金山毒霸、金山网盾”

Modules:#崩溃发生时程序加载的模块#
————————————-
Thunder.exe[ 00400000 ]D:\迅雷\Program\Thunder.exe[ 5.9.12.1196 (2009-11-30 22:52:32) ] size=2568192
MFC71u.dll[ 00680000 ]C:\WINDOWS\system32\MFC71u.dll[ 7.10.6101.0 (2009-07-12 08:51:44) ] size=1064960
kis.dll[ 01110000 ]C:\Program Files\Kingsoft\Kingsoft Internet Security\kis.dll[ 2009.6.15.929 (2009-06-15 16:43:23) ] size=249856
kwsui.dll[ 01190000 ]C:\Program Files\Kingsoft\Kingsoft Internet Security\webshield\kwsui.dll[ 2009.12.23.6 (2009-12-23 16:45:34) ] size=344064
xpsp2res.dll[ 0C300000 ]C:\WINDOWS\system32\xpsp2res.dll[ 5.1.2600.5512 (2008-04-14 01:39:24) ] size=5541888
MSOXMLMF.DLL[ 0CFC0000 ]C:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSOXMLMF.DLL[ 11.0.8164.0 (2007-04-14 06:22:39) ] size=53248
KMailOEBand.DLL[ 10000000 ]C:\Program Files\Kingsoft\Kingsoft Internet Security\KMailOEBand.DLL[ 2009.2.13.759 (2009-02-13 23:25:22) ] size=86016
libexpat.dll[ 21030000 ]D:\迅雷\Program\libexpat.dll[ 0.0.0.0 (2009-11-30 23:08:19) ] size=114688
liblua.dll[ 210D0000 ]D:\迅雷\Program\liblua.dll[ 0.0.0.0 (2009-11-30 23:08:19) ] size=135168
libpng13.dll[ 21130000 ]D:\迅雷\Program\libpng13.dll[ 1.2.38.0 (2009-11-30 23:08:19) ] size=233472
minizip.dll[ 211C0000 ]D:\迅雷\Program\minizip.dll[ 0.0.0.0 (2009-11-30 23:08:19) ] size=28672
mini_unzip_dll.dll[ 211F0000 ]D:\迅雷\Program\mini_unzip_dll.dll[ 0.0.0.0 (2009-11-30 23:08:19) ] size=24576
sqlite3.dll[ 21210000 ]D:\迅雷\Program\sqlite3.dll[ 0.0.0.0 (2009-11-30 23:08:19) ] size=376832
xl_client.dll[ 21380000 ]D:\迅雷\Program\xl_client.dll[ 1.10.2.24 (2009-11-30 23:08:20) ] size=163840
xl_data.dll[ 213E0000 ]D:\迅雷\Program\xl_data.dll[ 1.10.2.24 (2009-11-30 23:08:20) ] size=94208
zlib1.dll[ 21420000 ]D:\迅雷\Program\zlib1.dll[ 1.2.2.0 (2009-11-30 23:08:20) ] size=90112
asyn_frame.dll[ 23B20000 ]D:\迅雷\Program\asyn_frame.dll[ 1.4.2.39 (2009-11-30 23:08:22) ] size=380928
dl_peer_id.dll[ 23CD0000 ]D:\迅雷\Program\dl_peer_id.dll[ 3.1.2.7 (2009-11-30 23:08:23) ] size=81920
download_interface.dll[ 23DA0000 ]D:\迅雷\Program\download_interface.dll[ 1.0.2.45 (2009-11-30 23:08:23) ] size=425984
mp.dll[ 24150000 ]D:\迅雷\Program\mp.dll[ 1.0.2.7 (2009-11-30 23:08:23) ] size=28672
DllNewTask.DLL[ 25520000 ]D:\迅雷\Program\DllNewTask.DLL[ 5.9.12.1196 (2009-11-30 23:08:24) ] size=503808
GougouSearch.dll[ 257F0000 ]D:\迅雷\Program\GougouSearch.dll[ 5.9.12.1196 (2009-11-30 23:08:24) ] size=86016
SkinEngine2.dll[ 258C0000 ]D:\迅雷\Program\SkinEngine2.dll[ 5.9.12.1196 (2009-11-30 23:08:25) ] size=290816
ThunderS.dll[ 25970000 ]D:\迅雷\Program\ThunderS.dll[ 5.9.12.1196 (2009-11-30 23:08:25) ] size=491520
ThunderStorage.dll[ 25A30000 ]D:\迅雷\Program\ThunderStorage.dll[ 5.9.12.1196 (2009-11-30 23:08:25) ] size=524288
UACTool.dll[ 25B20000 ]D:\迅雷\Program\UACTool.dll[ 0.0.0.0 (2009-11-30 23:08:25) ] size=36864
XLBugHandler.dll[ 25B70000 ]D:\迅雷\Program\XLBugHandler.dll[ 2.1.0.8 (2009-11-30 23:08:25) ] size=307200
XLGraphic.dll[ 25BD0000 ]D:\迅雷\Program\XLGraphic.dll[ 0.0.0.0 (2009-11-30 23:08:25) ] size=49152
XLGUIDevEnv.dll[ 25C00000 ]D:\迅雷\Program\XLGUIDevEnv.dll[ 5.9.12.1196 (2009-11-30 23:08:25) ] size=966656
XLGUIPlatform.dll[ 25DE0000 ]D:\迅雷\Program\XLGUIPlatform.dll[ 5.9.12.1196 (2009-11-30 23:08:25) ] size=483328

3、得出分析结论

在说分析结论前,需要先简单说明“EID”与“崩溃堆栈”的关系

在崩溃堆栈中,“模块与绝对地址”,是定位问题的关键。(例如:XLGUIDevEnv.dll[00046A5E])

一般情况下,只要2个崩溃之间的“模块与绝对地址”相同,那么EID也是相同的。就属于同一个问题。

  在上面的文章里,我们已经通过分析堆栈和模块,确定了这次崩溃是

  “安装于WindowsXP SP3操作系统中的迅雷5.9.12.1196版本,于启动后3分钟发生XLGUIDevEnv.dll崩溃,该类型崩溃EID为25-032A0A4。注:本机同时安装了“金山毒霸、金山网盾”等安全软件

  有了这些信息,当你反馈这个崩溃时,将会大大减少沟通成本。问题的解决效率也会更高。

  对了!如果你定位出来崩溃发生在非迅雷模块上时,就更有意思了。

例如:

  1、崩溃发生在flash9b.ocx,说明这是操作系统中安装的flash组件导致的崩溃,升级flash组件就可能解决此问题了。

  2、崩溃发生在某些不知名的文件上时,用搜索引擎搜索一下,就能知道这是什么文件了,如果是个木马、病毒,那么杀毒就能解决你的崩溃问题。

  下次要是遇到MM求助“葛格,我的迅雷崩溃叻”,你就可以说“妹子,别急,让哥给你瞧瞧!”


第一次更新:

  补充:迅雷安装目录的Program文件夹里的“msvcp71.dll、msvcr71.dll、msvcirt.dll、MFC71u.dll”都属于系统库,因部分用户机器上缺少其中的某个文件,因此迅雷默认包含了这些文件。