troushoo

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

  1. --/--/--(--) --:--:--|
  2. スポンサー広告

ブート時ハングのダンプ解析

ブート処理が進まない際のダンプ解析例を紹介します。

ダンプ解析手順
0. (画面下に表示されている円は回り続け、画面処理はあるものの) ブート画面が一向に進まない際のダンプを採取します。


1. !locks コマンドを実行してみます。
!locks コマンドは、リソース(ERESOURCE)のロック状態を表示するコマンドです。<*> が表示されているスレッドが、リソースを獲得しているスレッドです。
スレッドffffe0018d9c7880 とスレッドffffe000b3e32040 が、スレッドffffe000b303b880 が排他的に保持している(Exclusively owned)リソースの開放を待っている状態であることがわかります。

1: kd> !locks
**** DUMP OF ALL RESOURCE OBJECTS ****
KD: Scanning for held locks....

Resource @ 0xffffe000b3e456d0    Exclusively owned
    Contention Count = 1
    NumberOfExclusiveWaiters = 1
     Threads: ffffe000b303b880-01<*>
     Threads Waiting On Exclusive Access:
              ffffe000b3e33880      

KD: Scanning for held locks..

Resource @ 0xffffe000b3e3c5c0    Exclusively owned
    Contention Count = 1
    NumberOfExclusiveWaiters = 1
     Threads: ffffe000b303b880-01<*>
     Threads Waiting On Exclusive Access:
              ffffe000b3e32040      

KD: Scanning for held locks.
193 total locks, 2 locks currently held


2. リソースを保持しているスレッドffffe000b303b880 を、!thread コマンドを用いて見てみます。
すると、スレッドffffe000b3e32040 を待っていることがわかります。
また、コールスタックにfmm がいることもわかります。

1: kd> !thread ffffe000b303b880
THREAD ffffe000b303b880  Cid 0004.0008  Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Non-Alertable
    ffffe000b3e32040  Thread
IRP List:
    ffffe000b3931b40: (0006,04c0) Flags: 00000884  Mdl: 00000000
Not impersonating
DeviceMap                 ffffc0007740c280
Owning Process            ffffe000b30bb580       Image:         System
Attached Process          N/A            Image:         N/A
Wait Start TickCount      456            Ticks: 65315 (0:00:17:00.546)
Context Switch Count      711            IdealProcessor: 0            
UserTime                  00:00:00.000
KernelTime                00:00:03.296
Win32 Start Address nt!Phase1Initialization (0xfffff8038f560004)
Stack Init ffffd00104991dd0 Current ffffd00104990b40
Base ffffd00104992000 Limit ffffd0010498c000 Call 0
Priority 31 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Child-SP          RetAddr           : Args to Child                                                           : Call Site
ffffd001`04990b80 fffff803`8f1324ee : fffff803`8f377180 ffffe000`b303b880 00000000`fffffffe 00000000`00000000 : nt!KiSwapContext+0x76
ffffd001`04990cc0 fffff803`8f131f69 : 00000000`00000000 00000000`00000000 00000000`00000000 fffff803`8f43fbd3 : nt!KiSwapThread+0x14e
ffffd001`04990d60 fffff803`8f0e7563 : ffffe000`b3909010 00000000`00000000 00000000`00000000 ffffe000`b3e3c640 : nt!KiCommitThreadWait+0x129
ffffd001`04990de0 fffff801`6692f32f : ffffe000`b3e32040 ffffd001`00000000 00000000`00000000 ffffe000`00000000 : nt!KeWaitForSingleObject+0x373
ffffd001`04990e70 fffff801`66902123 : ffffd001`04990f30 00000000`00000005 00000000`00000008 ffffe000`00000002 : fmm!FmmInstanceSetup+0x40f [c:\users\tr\documents\visual studio 2015\projects\metadatamanager\metadatamanagerinit.c @ 666]
ffffd001`04990f10 fffff801`66901e4b : ffffe000`b3e334b0 ffffe000`b3e45010 ffffd001`04991002 ffffe000`b3e45010 : fltmgr!FltpDoInstanceSetupNotification+0x87
ffffd001`04990f70 fffff801`66901969 : 00000000`00000000 ffffd001`04991138 ffffe000`00000005 ffffe000`00000006 : fltmgr!FltpInitInstance+0x2db
ffffd001`04991000 fffff801`66901b1d : 00000000`00000000 ffffe000`b3e45010 ffffe000`b3909020 ffffd001`0000001a : fltmgr!FltpCreateInstanceFromName+0x1ad
ffffd001`049910e0 fffff801`66902432 : ffffe000`b3909020 ffffe000`b3909010 ffffe000`b3931b02 ffffe000`00000016 : fltmgr!FltpEnumerateRegistryInstances+0x145
ffffd001`04991180 fffff801`668f64f4 : ffffe000`b3e45010 fffff803`00000000 ffffe000`b3909020 ffffe000`b3914010 : fltmgr!FltpDoFilterNotificationForNewVolume+0x126
ffffd001`04991200 fffff803`8f432321 : 00000000`00000000 00000000`00000004 00000000`00000000 00000000`00000000 : fltmgr!FltpCreate+0x4e2
ffffd001`049912b0 fffff803`8f518fa4 : 00000000`00000000 00000000`00000000 00000000`00000000 ffffe000`b3e01590 : nt!IopParseDevice+0x6c1
ffffd001`049914d0 fffff803`8f436983 : 00000000`00000000 ffffd001`04991678 00000000`00000040 ffffe000`b3151840 : nt!ObpLookupObjectName+0x784
ffffd001`04991600 fffff803`8f49ffbb : ffff0423`00000001 ffffe000`b314ea48 00000000`00000000 00000000`00000020 : nt!ObOpenObjectByName+0x1e3
ffffd001`04991730 fffff803`8f49fa3a : ffffd001`04991958 00000000`c0100000 ffffd001`049918f0 00000000`00000000 : nt!IopCreateFile+0x36b
ffffd001`049917d0 fffff803`8f77b840 : 00000000`00000220 00000000`00000000 00000000`00000000 ffffe000`b30cf5f0 : nt!IoCreateFile+0x8a
ffffd001`04991860 fffff803`8f495078 : ffffc000`77687338 ffffc000`77687300 ffffd001`04991b00 ffffd001`04991a19 : nt!IopInitCrashDumpRegCallback+0xd8
ffffd001`04991930 fffff803`8f494ad8 : 00000000`00000000 ffffd001`04991a19 ffffd001`04991b00 00000000`0000009b : nt!RtlpCallQueryRegistryRoutine+0x274
ffffd001`04991990 fffff803`8f50215a : 00000000`00000000 00000000`00000000 fffff803`8d6b0a90 fffff803`8d6b0a90 : nt!RtlpQueryRegistryValues+0x178
ffffd001`04991a70 fffff803`8f784a92 : 00000000`00000000 ffffd001`04991b59 00000000`00000000 ffffe000`b3e472b0 : nt!RtlQueryRegistryValuesEx+0xe
ffffd001`04991ab0 fffff803`8f7892b6 : 00000000`00000000 00000000`00000000 00000000`00000006 fffff803`8d6b0a90 : nt!IopInitCrashDumpDuringSysInit+0xce
ffffd001`04991bc0 fffff803`8f77381d : fffff803`8f560004 fffff803`8d6b0a90 ffffe000`b303b880 ffffe000`b30bb800 : nt!IoInitSystemPreDrivers+0x9b2
ffffd001`04991ce0 fffff803`8f56002e : 80000000`00380121 fffff803`8d6b0a90 ffffe000`b303b880 ffffe000`b30bb848 : nt!IoInitSystem+0x9
ffffd001`04991d10 fffff803`8f174c10 : ffffe000`b303b880 80000000`00380121 80000000`00380121 80000000`00380121 : nt!Phase1Initialization+0x2a
ffffd001`04991d40 fffff803`8f1ce9c6 : fffff803`8f377180 ffffe000`b303b880 fffff803`8f3cfa00 80000000`00380121 : nt!PspSystemThreadStartup+0x58
ffffd001`04991da0 00000000`00000000 : ffffd001`04992000 ffffd001`0498c000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x16


3. 上記から、スレッドffffe000b3e32040 はスレッドffffe000b303b880 を待っており、一方スレッドffffe000b303b880 はスレッドffffe000b3e32040 を待っておりデットロックが発生していることがわかりました。
このデッドロックのためブート処理が進まなかったこととなります。

4. スレッドffffe000b3e32040 のコールスタックを確認してみます。
こちらもfmm がいることがわかりました。

1: kd> !thread ffffe000b3e32040
THREAD ffffe000b3e32040  Cid 0004.00c4  Teb: 0000000000000000 Win32Thread: 0000000000000000 WAIT: (WrResource) KernelMode Non-Alertable
    ffffe000b3080310  SynchronizationEvent
Not impersonating
DeviceMap                 ffffc0007740c280
Owning Process            ffffe000b30bb580       Image:         System
Attached Process          N/A            Image:         N/A
Wait Start TickCount      65411          Ticks: 360 (0:00:00:05.625)
Context Switch Count      255            IdealProcessor: 1            
UserTime                  00:00:00.000
KernelTime                00:00:00.000
Win32 Start Address fmm!TLInspectWorker (0xfffff80166928250)
Stack Init ffffd001057c9dd0 Current ffffd001057c9900
Base ffffd001057ca000 Limit ffffd001057c4000 Call 0
Priority 8 BasePriority 8 UnusualBoost 0 ForegroundBoost 0 IoPriority 2 PagePriority 5
Child-SP          RetAddr           : Args to Child                                                           : Call Site
ffffd001`057c9940 fffff803`8f1324ee : ffffd001`08600180 ffffe000`b3e32040 ffffe000`fffffffe fffff801`fffffffe : nt!KiSwapContext+0x76
ffffd001`057c9a80 fffff803`8f131f69 : ffffe000`b3e32040 fffff803`8f0b6a78 00000000`00000002 fffff801`665d2b25 : nt!KiSwapThread+0x14e
ffffd001`057c9b20 fffff803`8f0b686e : 00000000`00000001 ffffe000`b3e32180 00000000`00000028 00000000`00000002 : nt!KiCommitThreadWait+0x129
ffffd001`057c9ba0 fffff803`8f0d9eaa : ffffe000`b3e3c5c0 ffffe000`b3080310 00000000`000000fe ffffe000`00000002 : nt!ExpWaitForResource+0x58e
ffffd001`057c9c50 fffff801`6692809e : ffffe000`b3e38b02 ffffe000`b3e32040 00000000`00000080 ffffe000`b3e32040 : nt!ExAcquireResourceExclusiveLite+0x1da
ffffd001`057c9cc0 fffff801`66928274 : ffffe000`b3e3c5c0 00000000`00000000 ffffe000`b3d829e0 fffff803`8f137d65 : fmm!FmmAcquireResourceExclusive+0x9e [c:\users\tr\documents\visual studio 2015\projects\metadatamanager\metadatamanagerproc.h @ 222]
ffffd001`057c9d00 fffff803`8f174c10 : ffffe000`b3e3c5a0 00000000`00000010 00000000`00000000 00000000`00000000 : fmm!TLInspectWorker+0x24 [c:\users\tr\documents\visual studio 2015\projects\metadatamanager\metadatamanagerinit.c @ 459]
ffffd001`057c9d40 fffff803`8f1ce9c6 : fffff803`8f377180 ffffe000`b3e32040 ffffe000`b3e33880 00000000`00100000 : nt!PspSystemThreadStartup+0x58
ffffd001`057c9da0 00000000`00000000 : ffffd001`057ca000 ffffd001`057c4000 00000000`00000000 00000000`00000000 : nt!KiStartSystemThread+0x16


5. これらより、fmm にてデッドロックが発生したために、ブート処理が進まなかったことがわかりました。

補足
今回のコードを見てみます。
(今回のコードはMicrosoft よりGitHub に公開されているMetadataManager をひな形に作成しました)
リソースを保持し、スレッドを待っているスレッドffffe000b303b880 の外套部分のコードは以下です。
//リソースを排他的に保持
FmmAcquireResourceExclusive( &instanceContext->MetadataResource );
 
//システムスレッドを作成
status = PsCreateSystemThread(
    &threadHandle,
    THREAD_ALL_ACCESS,
    NULL,
    NULL,
    NULL,
    TLInspectWorker,
    instanceContext
);
if (!NT_SUCCESS(status))
{
    return status;
}
 
//スレッドオブジェクトを取得
status = ObReferenceObjectByHandle(
    threadHandle,
    0,
    NULL,
    KernelMode,
    &ThreadObj,
    NULL
);
NT_ASSERT(NT_SUCCESS(status));
 
//スレッドを待つ
KeWaitForSingleObject(ThreadObj, Executive, KernelMode, FALSE, NULL);

一方、実行中である、リソース開放を待っているスレッドffffe000b3e32040 は以下です。
void
TLInspectWorker(
    _In_ void* StartContext
)
{
    PFMM_INSTANCE_CONTEXT instanceContexttemp;
 
    instanceContexttemp = StartContext;
 
    FmmAcquireResourceExclusive(&instanceContexttemp->MetadataResource);
    
}

FmmAcquireResourceExclusive は以下です。(テストのため、今回は、KeEnterCriticalRegion はコメントアウトして使用しました)

VOID
FmmAcquireResourceExclusive (
    _Inout_ _Requires_lock_not_held_(*_Curr_) _Acquires_exclusive_lock_(*_Curr_)
    PERESOURCE Resource
    )
{
    FLT_ASSERT(KeGetCurrentIrql() <= APC_LEVEL);
    FLT_ASSERT(ExIsResourceAcquiredExclusiveLite(Resource) ||
               !ExIsResourceAcquiredSharedLite(Resource));
 
    //KeEnterCriticalRegion();
    (VOID)ExAcquireResourceExclusiveLite( Resource, TRUE );
}

 


関連URL
Red alert! My Server is hung – what do I do?
関連記事
Visual Studio を用いてドライバーの開発
  1. 2016/06/20(月) 23:57:40|
  2. WinDbg
  3. | トラックバック:0
  4. | コメント:0
<<任意のPowerShell コマンドレットのソースコードを確認 | ホーム | netsh コマンドを利用した、IPsec 通信のトラブルシューティング>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://troushoo.blog.fc2.com/tb.php/294-0617131a
この記事にトラックバックする(FC2ブログユーザー)

スポンサーリンク

最新記事

月別アーカイブ

カテゴリ

ツール (92)
ネットワーク (76)
Visual Studio (56)
SOS・Psscor2/Psscor4 (25)
WinDbg (25)
Linux (24)
Azure (17)
Tips (20)
英語 (1)
About Me (1)
未分類 (0)

全記事表示リンク

全ての記事を表示する

検索フォーム

RSSリンクの表示

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。