How to debug a Visual C++ Runtime Error

文章目录




一个程序总算是把一些异常崩溃这些弄得差不多了,能够长时间稳定运行了,但是还是会随机出现崩溃这个问题,而且崩溃了没提供调试选项,没有装VS,只有复制个windbg过去,然后出现断点 查看堆栈信息
1
2
3
4
5
6
7
0:009> k
ChildEBP RetAddr
064afd8c 779ef826 ntdll!DbgBreakPoint
064afdbc 757833ca ntdll!DbgUiRemoteBreakin+0x3c
064afdc8 77989ed2 kernel32!BaseThreadInitThunk+0xe
064afe08 77989ea5 ntdll!__RtlUserThreadStart+0x70
064afe20 00000000 ntdll!_RtlUserThreadStart+0x1b

明显不对啊,没有出现异常的情况啊,想想还是google一些在stackoverflow看到一些,但是感觉也没啥用啊
转念一想,这个崩溃好像和之前的不一样,没提供调试选项 就一个 确定按钮 然后 是不是windbg断在其他的线程了呢?
查看所有线程堆栈,发现线程很多。。。。。。。。。。
怎么才能找到崩溃的线程,看着那个对话框 想到应该是个MessageBox找一下有的,看哈堆栈 在看哈参数好像就是这个线程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
0:009> ~*kv
.......

2 Id: a10.1030 Suspend: 1 Teb: 7efd7000 Unfrozen
ChildEBP RetAddr Args to Child
0388e370 759acd46 00000000 00000000 00000000 USER32!NtUserWaitMessage+0x15 (FPO: [0,0,0])
0388e3ac 759acf5c 00950b28 00000000 00000000 USER32!DialogBox2+0x222 (FPO: [Non-Fpo])
0388e3d8 759df73c 75970000 005f5a90 00000000 USER32!InternalDialogBox+0xe5 (FPO: [Non-Fpo])
0388e48c 759dfa18 00012010 00000000 ffffffff USER32!SoftModalMessageBox+0x757 (FPO: [Non-Fpo])
0388e5e4 759dfb1f 0388e5f0 00000028 00000000 USER32!MessageBoxWorker+0x269 (FPO: [Non-Fpo])
0388e650 759dfb9e 00000000 00660bf0 005f6520 USER32!MessageBoxTimeoutW+0x52 (FPO: [Non-Fpo])
0388e684 759dfcf1 00000000 0388e820 1000d664 USER32!MessageBoxTimeoutA+0x76 (FPO: [Non-Fpo])
0388e6a4 759dfd36 00000000 0388e820 1000d664 USER32!MessageBoxExA+0x1b (FPO: [Non-Fpo])
0388e6c0 10009c4a 00000000 0388e820 1000d664 USER32!MessageBoxA+0x18 (FPO: [Non-Fpo])
WARNING: Stack unwind information not available. Following frames may be wrong.
0388e8c0 100097c5 0000000a 10007764 10009605 xxxxxxxxxx!GetCIDW+0x8b3a
0388e8f8 757c0047 0388e9b0 acda4d70 00000000 xxxxxxxxxx!GetCIDW+0x86b5
0388e980 779c21d7 0388e9b0 779c20b4 00000000 kernel32!UnhandledExceptionFilter+0x127 (FPO: [Non-Fpo])
0388e988 779c20b4 00000000 0388fc28 7797c520 ntdll!__RtlUserThreadStart+0x62 (FPO: [SEH])
0388e99c 779c1f59 00000000 00000000 00000000 ntdll!_EH4_CallFilterFunc+0x12 (FPO: [Uses EBP] [0,0,4])
0388e9c4 77996ab9 fffffffe 0388fc18 0388eb00 ntdll!_except_handler4+0x8e (FPO: [Non-Fpo])
0388e9e8 77996a8b 0388eab0 0388fc18 0388eb00 ntdll!ExecuteHandler2+0x26 (FPO: [Uses EBP] [5,3,1])
0388ea0c 77996a2d 0388eab0 0388fc18 0388eb00 ntdll!ExecuteHandler+0x24 (FPO: [5,0,3])
0388ea98 77960143 0188eab0 0388eb00 0388eab0 ntdll!RtlDispatchException+0x127 (FPO: [Non-Fpo])
0388ea98 00000000 0188eab0 0388eb00 0388eab0 ntdll!KiUserExceptionDispatcher+0xf (FPO: [2,0,0]) (CONTEXT @ 00000008)
.......

0388e820 52 75 6e 74 69 6d 65 20-45 72 72 6f 72 21 0a 0a Runtime Error!..
0388e830 50 72 6f 67 72 61 6d 3a-20 45 3a 5c 66 66 66 66 Program: E:\xxxx
0388e840 66 66 66 66 66 66 66 66-66 66 66 66 66 65 72 5f xxxxxx\xxxxxxxx_
0388e850 64 5f 41 70 74 2e 65 78-65 0a 0a 0d 0a 61 62 6e xxxxx.exe....abn
0388e860 6f 72 6d 61 6c 20 70 72-6f 67 72 61 6d 20 74 65 ormal program te
0388e870 72 6d 69 6e 61 74 69 6f-6e 0d 0a 00 80 00 00 00 rmination.......

嗯,继续调哈具体是那里bug吧
调试流程和这个比较像深夜调试某浏览器内存损坏的小记录就不写了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
0:009> dt  _EXCEPTION_POINTERS -b 0388e9b0
msvcr90d!_EXCEPTION_POINTERS
+0x000 ExceptionRecord : 0x0388eab0
+0x004 ContextRecord : 0x0388eb00

0:009> .exr 0x0388eab0
ExceptionAddress: 7662b727 (KERNELBASE!RaiseException+0x00000058)
ExceptionCode: e06d7363 (C++ EH exception)
ExceptionFlags: 00000001
NumberParameters: 3
Parameter[0]: 19930520
Parameter[1]: 0388f014
Parameter[2]: 01001550
pExceptionObject: 0388f014
_s_ThrowInfo : 01001550
Type : class CppSQLite3Exceptio

0:009> .cxr 0x0388eb00
eax=0388ef64 ebx=00000000 ecx=00000003 edx=00000000 esi=00ff1fc0 edi=0388eff4
eip=7662b727 esp=0388ef64 ebp=0388efb4 iopl=0 nv up ei pl nz ac po nc
cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00000212
KERNELBASE!RaiseException+0x58:
7662b727 c9 leave

0:009> dt _EXCEPTION_RECORD 0x0388eab0
msvcr90d!_EXCEPTION_RECORD
+0x000 ExceptionCode : 0xe06d7363
+0x004 ExceptionFlags : 1
+0x008 ExceptionRecord : (null)
+0x00c ExceptionAddress : 0x7662b727 Void
+0x010 NumberParameters : 3
+0x014 ExceptionInformation : [15] 0x19930520

相关参考:
分析两种Dump(崩溃日志)文件生成的方法及比较
今天查内存泄漏,转一下AppVerifier使用文章