ハンドルやヒープなどに関連する厄介なメモリ問題を抱えたWindowsアプリケーションは、WinDbg内部から起動し、徹底的に調査する必要があります。今回は、この回とこの回を全面書き換えし、ターゲットアプリケーションの起動からクラッシュダンプファイルの作成・分析まで自動化するサンプルコードを用意しました。今回の技法と他の回で取り上げた技法とうまく組み合わせれば、ユーザモードとカーネルモードの両レベルでの自動分析が可能となるため、ほとんどの問題の原因を特定するWinDbgスクリプトコード(WinDbgアプリケーション)を開発することも夢ではないでしょう。
0012fbb4 7c994a15 ntdll!RtlApplicationVerifierStop+0x160
0012fbb8 00000008
0012fbbc 01617f98
0012fbc0 00000000
0012fbc4 009a8392
0012fbc8 0012fc44
0012fbcc 7c9a9354 ntdll!RtlpDphReportCorruptedBlock+0x92
0012fbd0 00000008
0012fbd4 7c9a9594 ntdll!RtlpDphShouldAllocateInPageHeap+0xf2
0012fbd8 015b1000
---
Loading Dump File [C:\Temp\new.dmp]
User Mini Dump File with Full Memory: Only application data is available
Windows XP Version 2600 (Service Pack 2) UP Free x86 compatible
Product: WinNt, suite: SingleUserTS
Debug session time: Mon Oct 20 16:40:10.000 2008 (GMT+9)
System Uptime: 0 days 8:39:26.945
Process Uptime: 0 days 0:00:04.000
.......
This dump file has an exception of interest stored in it.
The stored exception information can be accessed via .ecxr.
eax=00000001 ebx=01619f98 ecx=7c95eb05 edx=0000003d esi=00000008 edi=015b1000
eip=7c941230 esp=0012fbb4 ebp=0012fbc8 iopl=0 nv up ei pl zr na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000246
ntdll!DbgBreakPoint:
7c941230 cc int 3
0:000> !analyze -v
*** Omitted ***
FAULTING_IP:
ntdll!DbgBreakPoint+0
7c941230 cc int 3
EXCEPTION_RECORD: ffffffff -- (.exr 0xffffffffffffffff)
ExceptionAddress: 7c941230 (ntdll!DbgBreakPoint)
ExceptionCode: 80000003 (Break instruction exception)
ExceptionFlags: 00000000
NumberParameters: 3
Parameter[0]: 00000000
Parameter[1]: 7c95eb05
Parameter[2]: 0000003d
DEFAULT_BUCKET_ID: STATUS_BREAKPOINT
PROCESS_NAME: heapcrash2.exe
ERROR_CODE: (NTSTATUS) 0x80000003 - {
NTGLOBALFLAG: 2000000
APPLICATION_VERIFIER_FLAGS: 0
FAULTING_THREAD: 00000efc
PRIMARY_PROBLEM_CLASS: STATUS_BREAKPOINT
BUGCHECK_STR: APPLICATION_FAULT_STATUS_BREAKPOINT
LAST_CONTROL_TRANSFER: from 7c9951ad to 7c941230
STACK_TEXT:
0012fbb0 7c9951ad 00000008 01619f98 00000000 ntdll!DbgBreakPoint
0012fbc8 7c9a9a94 00000008 7c9a9cd4 015b1000 ntdll!RtlApplicationVerifierStop+0x160
0012fc44 7c9aac57 015b1000 00000004 01619f98 ntdll!RtlpDphReportCorruptedBlock+0x92
0012fc68 7c9aae5a 015b1000 01001002 00000020 ntdll!RtlpDphNormalHeapFree+0x2e
0012fcb8 7c9adefb 015b0000 01001002 01619f98 ntdll!RtlpDebugPageHeapFree+0x79
0012fd2c 7c98a5d0 015b0000 01001002 01619f98 ntdll!RtlDebugFreeHeap+0x2c
0012fe14 7c9668ad 015b0000 01001002 01619f98 ntdll!RtlFreeHeapSlowly+0x37
0012fee4 785838bb 015b0000 00000000 01619f98 ntdll!RtlFreeHeap+0xf9
0012ff30 0040106d 01619f98 0040213c 01619f98 msvcr90!free+0xcd [f:\dd\vctools\crt_bld\self_x86\crt\src\free.c @ 110]
0012ff7c 004011f1 00000001 01612fc8 015bef60 heapcrash2!main+0x6d [d:\itdanwa\heapcrash2\heapcrash2\heapcrash2.cpp @ 21]
0012ffc0 7c816fd7 0020002a 00000000 7ffdf000 heapcrash2!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 582]
0012fff0 00000000 00401339 00000000 78746341 kernel32!BaseProcessStart+0x23
STACK_COMMAND: ~0s; .ecxr ; kb
FOLLOWUP_IP:
heapcrash2!main+6d [d:\itdanwa\heapcrash2\heapcrash2\heapcrash2.cpp @ 21]
0040106d 684c214000 push offset heapcrash2!`string' (0040214c)
FAULTING_SOURCE_CODE:
17: puts("Free: p2");
18: free(p2);
19: puts("Double-Free: p2");
20: free(p2);
> 21: puts("Double-Free: p3");
22: free(p3);
23:
24: Sleep(100);
25: }
26: return 0;
SYMBOL_STACK_INDEX: 9
SYMBOL_NAME: heapcrash2!main+6d
FOLLOWUP_NAME: Toyota 担当開発者
MODULE_NAME: heapcrash2
IMAGE_NAME: heapcrash2.exe
DEBUG_FLR_IMAGE_TIMESTAMP: 48e45ac1
FAILURE_BUCKET_ID: STATUS_BREAKPOINT_80000003_heapcrash2.exe!main
BUCKET_ID: APPLICATION_FAULT_STATUS_BREAKPOINT_heapcrash2!main+6d
Followup: Toyota 担当開発者
---------
なお、受講者のための質問メールをご用意いたしました(詳細)。