crash - 如何在 Windbg 中找到应用程序崩溃的根本原因?

标签 crash windbg

我有一个应用程序在用户执行特定操作时崩溃。例如,当我单击应用程序中的特定按钮时,它崩溃了。

因此,我将 windbg 附加到此应用程序,然后执行会触发崩溃的相同操作。

当崩溃发生时,调试器显示以下输出:

0:001> g
ModLoad: 04530000 04565000   C:\Windows\SysWOW64\ws2_32.DLL
ModLoad: 72430000 7246c000   C:\Windows\SysWOW64\mswsock.dll
ModLoad: 723e0000 723e5000   C:\Windows\SysWOW64\wshtcpip.dll
(10b0.1e9c): C++ EH exception - code e06d7363 (first chance)
(10b0.1c94): C++ EH exception - code e06d7363 (first chance)
(10b0.1c94): C++ EH exception - code e06d7363 (!!! second chance !!!)
eax=00000000 ebx=040ee7e0 ecx=00000003 edx=00000000 esi=005c7630 edi=00400000
eip=770715de esp=040ee7cc ebp=040eece4 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!ZwRaiseException+0x12:
770715de 83c404          add     esp,4

我想分析上面的输出,找出这个异常的根本原因。也许,我可以向这个应用程序的开发者报告它?但据我所知,我想掌握这个输出。

当我单击该按钮时,我可以看到 exe 加载了 3 个 dll:ws2_32.dll、mswsock.dll 和 wshtcpip.dll,这可能是因为它使用了从这些已加载模块导出的函数。

有 2 个第一次机会异常,异常代码为:e06d7363,这是根据 Visual C++ 编译器的异常代码。

我不确定为什么会出现第二次机会异常以及那里到底发生了什么?

下面是调试器中此时调用栈的 View ,

0:001> k
ChildEBP RetAddr  
03a4e7cc 7706014d ntdll!ZwRaiseException+0x12
03a4e7cc 00000000 ntdll!KiUserExceptionDispatcher+0x29

我在调试器中再次按下 g 以允许应用程序处理异常,这是调试器中的输出,

0:001> g
WARNING: Continuing a non-continuable exception
(114c.390): Unknown exception - code 00000000 (first chance)
(114c.390): Unknown exception - code 00000000 (!!! second chance !!!)
eax=00000000 ebx=03a4e318 ecx=83ee0000 edx=026ce8b8 esi=007073e0 edi=00400000
eip=770715de esp=03a4e304 ebp=03a4ece4 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!ZwRaiseException+0x12:
770715de 83c404          add     esp,4

那么,看起来像是应用程序未处理的异常?


这里是详细信息。我已经使用 kv 命令显示堆栈上的参数。希望这些信息可以帮助您排除故障。

0:001> g
ModLoad: 040a0000 040d5000   C:\Windows\SysWOW64\ws2_32.DLL
ModLoad: 72430000 7246c000   C:\Windows\SysWOW64\mswsock.dll
ModLoad: 723e0000 723e5000   C:\Windows\SysWOW64\wshtcpip.dll
(193c.1810): C++ EH exception - code e06d7363 (first chance)
(193c.1810): C++ EH exception - code e06d7363 (!!! second chance !!!)
eax=00000000 ebx=02c1e7e0 ecx=00000003 edx=00000000 esi=007073e0 edi=00400000
eip=770715de esp=02c1e7cc ebp=02c1ece4 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!ZwRaiseException+0x12:
770715de 83c404          add     esp,4
0:001> kv
ChildEBP RetAddr  Args to Child              
02c1e7cc 7706014d 02c1e7e0 02c1e830 00000000 ntdll!ZwRaiseException+0x12 (FPO: [3,0,0])
02c1e7cc 00000000 02c1e7e0 02c1e830 00000000 ntdll!KiUserExceptionDispatcher+0x29     (FPO: [2,0,0]) (CONTEXT @ 0000000c)
0:001> g
WARNING: Continuing a non-continuable exception
(193c.1810): Unknown exception - code 00000000 (first chance)
(193c.1810): Unknown exception - code 00000000 (!!! second chance !!!)
eax=00000000 ebx=02c1e318 ecx=e04b0000 edx=0096e8b8 esi=007073e0 edi=00400000
eip=770715de esp=02c1e304 ebp=02c1ece4 iopl=0         nv up ei pl zr na pe nc
cs=0023  ss=002b  ds=002b  es=002b  fs=0053  gs=002b             efl=00000246
ntdll!ZwRaiseException+0x12:
770715de 83c404          add     esp,4

最佳答案

一些评论

  • 线程 (10b0.1e9c) 发生异常并正在处理异常
  • Thread (10b0.1c94) 没有处理异常。为了分析这一点,我们需要 查看堆栈跟踪。但是堆栈跟踪不完整,应该有 使用 kv 命令创建以显示堆栈上的参数。
  • 第二个输出来自不同的进程:114c。所以它不一致。

为了分析这一点,我们需要在引发异常时输出kv,然后转储异常记录。请提供信息,然后我可以展示如何转储异常记录。

根据发布的结果运行:“.exr 02c1e830”

关于crash - 如何在 Windbg 中找到应用程序崩溃的根本原因?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8950114/

相关文章:

android - 打开“编辑”对话框并旋转设备时,应用崩溃

java - Android 对话框主题使 setContentView 使应用程序崩溃

debugging - 将 DLL 固定在内存中(增加引用计数)

c++ - Windbg 语法 - 将两个命令(MASM 和 C++)合二为一

debugging - "!heap -flt -s xxxx"windbg命令中的不同列代表什么

Windbg:如何在线程执行命令中显示线程详细信息?

iphone - NSLocalizedStringFromTable 崩溃

ipad - ARC 环境下 iPad 上的 UIPopoverController 和 UIImagePickerController

assembly - 可以使用 ARM 工具链在 CW 10.6 上停用拇指互操作吗?

windbg - 使用WinDbg,保存.dmp文件