ビジネス WinDbgアプリケーション開発技術 イメージロード(ユーザモードとカーネルモード)



詳しい技術情報を閲覧するには、有料講座を受講する必要があります。

2008年11月16日(日)
 ハンドルやヒープなどに関連する厄介なメモリ問題を抱えた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 担当開発者
---------

 なお、受講者のための質問メールをご用意いたしました(詳細)。

2008年11月15日(土)
 今回はヒープ問題を取り上げるこの回を全面改定し、サンプルコードも新規に作り直しました。サンプルコードを実行すると、クラッシュダンプファイルが背後で作成されます。今回使用したターゲットアプリケーションは内部にヒープ問題を抱えています。筆者はターゲットアプリケーションをバッチビルドし、WinDbgからではなく通常のWindowsアプリケーションとしてまず実行してみました。すると、次のようなエラー情報が返されました。最初の画面はデバッグビルド版の実行結果で、第2情報はリリースビルド版実行時のクラッシュダンプファイルの内容の一部です。


STACK_TEXT:  
0012f650 7c94df2c 7c864742 00000002 0012f838 ntdll!KiFastSystemCallRet
0012f654 7c864742 00000002 0012f838 00000001 ntdll!NtWaitForMultipleObjects+0xc
0012fa08 7c843892 0012fa30 7c839b21 0012fa38 kernel32!UnhandledExceptionFilter+0x8b9
0012fa10 7c839b21 0012fa38 00000000 0012fa38 kernel32!BaseProcessStart+0x39
0012fa38 7c9432a8 0012fb24 0012ffe0 0012fb40 kernel32!_except_handler3+0x61
0012fa5c 7c94327a 0012fb24 0012ffe0 0012fb40 ntdll!ExecuteHandler2+0x26
0012fb0c 7c94e46a 00000000 0012fb40 0012fb24 ntdll!ExecuteHandler+0x24
0012fb0c 7c951669 00000000 0012fb40 0012fb24 ntdll!KiUserExceptionDispatcher+0xe
0012fe18 7c95082c 00002000 003901e0 0012fed0 ntdll!RtlpCoalesceFreeBlocks+0x128
0012feec 785838bb 00390000 00000000 003901e8 ntdll!RtlFreeHeap+0x2e9
0012ff38 00401063 003901e8 00402130 00395030 msvcr90!free+0xcd [f:\dd\vctools\crt_bld\self_x86\crt\src\free.c @ 110]
0012ff7c 004011f1 00000001 00393148 00393468 heapcrash2!main+0x63 [d:\itdanwa\heapcrash2\heapcrash2\heapcrash2.cpp @ 19]
0012ffc0 7c817067 00380033 00380034 7ffdc000 heapcrash2!__tmainCRTStartup+0x10f [f:\dd\vctools\crt_bld\self_x86\crt\src\crtexe.c @ 582]
0012fff0 00000000 00401339 00000000 78746341 kernel32!BaseProcessStart+0x23

 今回のようにターゲットアプリケーションのソースコードが利用できる場合、クラッシュ原因の特定は朝飯前です。このような障害情報が常に入手できれば、WinDbgでの分析結果を担当プログラマにフィールドバックし、アプリケーションの品質を向上させることができます。「heapcrash2!main+0x63」などの情報を見ると、思わず、ブレークポイントを設定し、停止した時点でのメモリダンプを取りたくなります。ちなみに、Windows OSが行う「ntdll!RtlpCoalesceFreeBlocks+0x128」処理は無効にすることが可能です。無効にすると、アプリケーションは何食わぬ顔でそのまま動作を継続します。

詳しい技術情報を閲覧するには、有料講座を受講する必要があります。

次へ | 前へ



 WinDbg入門  ホーム


Copyright©豊田孝 2004- 2009
本日は2009-01-07です。