WindowsのMinidump解析でChatGPT使ったら良かった



# 事の経緯
常時稼働させるためのWindowsPCを新たに購入して使い始めたものの、数時間放置すると何故か停止してしまう。
使っている間は問題ないし、初期設定をしていた時は落ちなかった気がする。
しかも落ちたときにファンが止まっているのに通電しているようで、火が出そうなくらい熱くなっていて本気で火事の心配になる。

BIOSの設定をいじったり、いくつか問題の切り分けを模索するが改善せず。

諦めかけつつイベントビューアーを眺めていたとき、ダンプファイルが生成されていることに気がつく。
ダンプの解析はハードル高いかも、、と思いながらも一縷の望みにかけてダンプ解析やってみた。

というのが経緯です。

# やったこと

1. イベントビューアーに`Minidump`とあったので「Windows minidump」のキーワードでググってみる。
1. Windowsの機能でクラッシュ時にメモリダンプすることを知る。
1. ダンプファイルの保存先は`%SystemRoot%\Minidump`（`C:\WINDOWS\Minidump`）と知る。→エクスプローラーで見ると確かにファイルがある。
![64c1b79acc4e88ba9c326612.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/f50a49f2-f3fa-5a5e-838e-ccb4843f06f2.png)
1. ダンプファイルを読み取るツールがいくつかあることを知る。
1. [Microsoft WinDbg](https://www.microsoft.com/en-us/p/windbg-preview/9pgjgd53tn86?ranMID=24542&ranEAID=kXQk6*ivFEQ&ranSiteID=kXQk6.ivFEQ-7fWwdEezelKI5UXGypml8A&epi=kXQk6.ivFEQ-7fWwdEezelKI5UXGypml8A&irgwc=1&OCID=AID2000142_aff_7593_1243925&tduid=%28ir__cys292biockftgk6kk0sohzg2u2xuhy221wj1una00%29%287593%29%281243925%29%28kXQk6.ivFEQ-7fWwdEezelKI5UXGypml8A%29%28%29&irclickid=_cys292biockftgk6kk0sohzg2u2xuhy221wj1una00&activetab=pivot:overviewtab)をMicrosoft Storeからインストール。
![64c1b888cc4e88ba9c326782.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/1bb13469-4c52-e5ce-91ea-4cdf1c94efdc.png)
1. WinDbgを起動し、`ファイル`→`Open dump file`で`C:\WINDOWS\Minidump`配下に出力されているダンプファイルを読み込む。
1. `!analyze -v`のリンクをクリックし解析を実行。
![64c1b949cc4e88ba9c32682f.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2985470/dc36f2e0-148c-56ec-3297-b2fa4c724939.png)
1. 以下の出力がされた。（うわ～読みたくない～、、と思った）
    ```
    8: kd> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Bugcheck Analysis                                    *
    *                                                                             *
    *******************************************************************************

    WIN32K_POWER_WATCHDOG_TIMEOUT (19c)
    Win32k did not turn the monitor on in a timely manner.
    Arguments:
    Arg1: 0000000000000050, Calling monitor driver to power on.
    Arg2: ffffc185bd8852c0, Pointer to the power request worker thread.
    Arg3: 0000000000000000
    Arg4: 0000000000000000

    Debugging Details:
    ------------------

    *** WARNING: Unable to verify timestamp for amdkmdag.sys

    KEY_VALUES_STRING: 1

        Key  : Analysis.CPU.mSec
        Value: 1031

        Key  : Analysis.Elapsed.mSec
        Value: 2190

        Key  : Analysis.IO.Other.Mb
        Value: 9

        Key  : Analysis.IO.Read.Mb
        Value: 0

        Key  : Analysis.IO.Write.Mb
        Value: 30

        Key  : Analysis.Init.CPU.mSec
        Value: 171

        Key  : Analysis.Init.Elapsed.mSec
        Value: 65423

        Key  : Analysis.Memory.CommitPeak.Mb
        Value: 100

        Key  : Bugcheck.Code.LegacyAPI
        Value: 0x19c

        Key  : Dump.Attributes.AsUlong
        Value: 1808

        Key  : Dump.Attributes.DiagDataWrittenToHeader
        Value: 1

        Key  : Dump.Attributes.ErrorCode
        Value: 0

        Key  : Dump.Attributes.KernelGeneratedTriageDump
        Value: 1

        Key  : Dump.Attributes.LastLine
        Value: Dump completed successfully.

        Key  : Dump.Attributes.ProgressPercentage
        Value: 0

        Key  : Failure.Bucket
        Value: 0x19C_DRVSETMONITORPOWERSTATE_HANG_amdkmdag!unknown_function

        Key  : Failure.Hash
        Value: {837c57be-432f-85ea-743f-9e9d66af2d6b}

        Key  : Hypervisor.Enlightenments.ValueHex
        Value: 1497cf94

        Key  : Hypervisor.Flags.AnyHypervisorPresent
        Value: 1

        Key  : Hypervisor.Flags.ApicEnlightened
        Value: 1

        Key  : Hypervisor.Flags.ApicVirtualizationAvailable
        Value: 0

        Key  : Hypervisor.Flags.AsyncMemoryHint
        Value: 0

        Key  : Hypervisor.Flags.CoreSchedulerRequested
        Value: 0

        Key  : Hypervisor.Flags.CpuManager
        Value: 1

        Key  : Hypervisor.Flags.DeprecateAutoEoi
        Value: 0

        Key  : Hypervisor.Flags.DynamicCpuDisabled
        Value: 1

        Key  : Hypervisor.Flags.Epf
        Value: 0

        Key  : Hypervisor.Flags.ExtendedProcessorMasks
        Value: 1

        Key  : Hypervisor.Flags.HardwareMbecAvailable
        Value: 1

        Key  : Hypervisor.Flags.MaxBankNumber
        Value: 0

        Key  : Hypervisor.Flags.MemoryZeroingControl
        Value: 0

        Key  : Hypervisor.Flags.NoExtendedRangeFlush
        Value: 0

        Key  : Hypervisor.Flags.NoNonArchCoreSharing
        Value: 1

        Key  : Hypervisor.Flags.Phase0InitDone
        Value: 1

        Key  : Hypervisor.Flags.PowerSchedulerQos
        Value: 0

        Key  : Hypervisor.Flags.RootScheduler
        Value: 0

        Key  : Hypervisor.Flags.SynicAvailable
        Value: 1

        Key  : Hypervisor.Flags.UseQpcBias
        Value: 0

        Key  : Hypervisor.Flags.Value
        Value: 4853999

        Key  : Hypervisor.Flags.ValueHex
        Value: 4a10ef

        Key  : Hypervisor.Flags.VpAssistPage
        Value: 1

        Key  : Hypervisor.Flags.VsmAvailable
        Value: 1

        Key  : Hypervisor.RootFlags.AccessStats
        Value: 1

        Key  : Hypervisor.RootFlags.CrashdumpEnlightened
        Value: 1

        Key  : Hypervisor.RootFlags.CreateVirtualProcessor
        Value: 1

        Key  : Hypervisor.RootFlags.DisableHyperthreading
        Value: 0

        Key  : Hypervisor.RootFlags.HostTimelineSync
        Value: 1

        Key  : Hypervisor.RootFlags.HypervisorDebuggingEnabled
        Value: 0

        Key  : Hypervisor.RootFlags.IsHyperV
        Value: 1

        Key  : Hypervisor.RootFlags.LivedumpEnlightened
        Value: 1

        Key  : Hypervisor.RootFlags.MapDeviceInterrupt
        Value: 1

        Key  : Hypervisor.RootFlags.MceEnlightened
        Value: 1

        Key  : Hypervisor.RootFlags.Nested
        Value: 0

        Key  : Hypervisor.RootFlags.StartLogicalProcessor
        Value: 1

        Key  : Hypervisor.RootFlags.Value
        Value: 1015

        Key  : Hypervisor.RootFlags.ValueHex
        Value: 3f7


    BUGCHECK_CODE:  19c

    BUGCHECK_P1: 50

    BUGCHECK_P2: ffffc185bd8852c0

    BUGCHECK_P3: 0

    BUGCHECK_P4: 0

    FILE_IN_CAB:  072623-19546-01.dmp

    TAG_NOT_DEFINED_202b:  *** Unknown TAG in analysis list 202b


    DUMP_FILE_ATTRIBUTES: 0x1808
      Kernel Generated Triage Dump

    BLACKBOXBSD: 1 (!blackboxbsd)


    BLACKBOXNTFS: 1 (!blackboxntfs)


    BLACKBOXPNP: 1 (!blackboxpnp)


    BLACKBOXWINLOGON: 1

    CUSTOMER_CRASH_COUNT:  1

    PROCESS_NAME:  csrss.exe

    FAULTING_THREAD:  ffffc185bd8852c0

    STACK_TEXT:  
    ffffab85`2d8ca590 fffff803`2ae40925     : ffffd401`e1651180 00000000`00000000 ffffc185`ac408040 ffffd401`e1651180 : nt!KiSwapContext+0x76
    ffffab85`2d8ca6d0 fffff803`2ae41d47     : ffffab85`2d8cab98 ffffc185`b6cf6710 ffffc185`b6e7ea90 00000000`00000000 : nt!KiSwapThread+0xb05
    ffffab85`2d8ca820 fffff803`2ae44396     : 00000000`00000000 00000000`00000001 00000000`00000000 00000000`00000000 : nt!KiCommitThreadWait+0x137
    ffffab85`2d8ca8d0 fffff803`89fb32cd     : ffffc185`d1f027c0 ffffc185`d1f027c0 ffffab85`2d8cad89 ffffab85`2d8caed4 : nt!KeWaitForSingleObject+0x256
    ffffab85`2d8cac70 ffffc185`d1f027c0     : ffffc185`d1f027c0 ffffab85`2d8cad89 ffffab85`2d8caed4 00000000`00000000 : amdkmdag+0x1f932cd
    ffffab85`2d8cac78 ffffc185`d1f027c0     : ffffab85`2d8cad89 ffffab85`2d8caed4 00000000`00000000 ffffab85`2d8caed4 : 0xffffc185`d1f027c0
    ffffab85`2d8cac80 ffffab85`2d8cad89     : ffffab85`2d8caed4 00000000`00000000 ffffab85`2d8caed4 ffffc185`b6ee98a0 : 0xffffc185`d1f027c0
    ffffab85`2d8cac88 ffffab85`2d8caed4     : 00000000`00000000 ffffab85`2d8caed4 ffffc185`b6ee98a0 fffff803`89deade2 : 0xffffab85`2d8cad89
    ffffab85`2d8cac90 00000000`00000000     : ffffab85`2d8caed4 ffffc185`b6ee98a0 fffff803`89deade2 00000000`00003e80 : 0xffffab85`2d8caed4


    SYMBOL_NAME:  amdkmdag+1f932cd

    MODULE_NAME: amdkmdag

    IMAGE_NAME:  amdkmdag.sys

    STACK_COMMAND:  .process /r /p 0xffffc185bff14140; .thread 0xffffc185bd8852c0 ; kb

    BUCKET_ID_FUNC_OFFSET:  1f932cd

    FAILURE_BUCKET_ID:  0x19C_DRVSETMONITORPOWERSTATE_HANG_amdkmdag!unknown_function

    OSPLATFORM_TYPE:  x64

    OSNAME:  Windows 10

    FAILURE_ID_HASH:  {837c57be-432f-85ea-743f-9e9d66af2d6b}

    Followup:     MachineOwner
    ---------
    ```
1. ChatGPTに投げてみる。
プロンプト
    ```
    Windows PCが突然停止し、minidumpが生成されました。
    このダンプファイルをWinDbgツールにかけたところ、以下の出力が得られました。
    障害の原因を調べてください。

    WinDbgのメッセージ：
    8: kd> !analyze -v
    *******************************************************************************
    *                                                                             *
    *                        Bugcheck Analysis                                    *
    *                                                                             *
    *******************************************************************************

    WIN32K_POWER_WATCHDOG_TIMEOUT (19c)
    ～～以下略～～
    ```
1. ChatGPT の回答
    ```
    WinDbgの分析によると、この問題はバグチェックコード`WIN32K_POWER_WATCHDOG_TIMEOUT (19c)`に関連しています。
    これは、Win32kがモニターをタイムリーにオンにできなかったことを示しています。特に問題となっているのは、
    `amdkmdag.sys`というAMDのグラフィックドライバーファイルです。このファイルに関連する操作
    （おそらくモニターの電源をオンにする操作）がタイムリーに完了せず、システムがクラッシュした可能性があります。

    解決策として以下の手順を試してみてください。

    1. **グラフィックカードドライバのアップデート：** 最新のドライバが存在するかを確認し、
      存在する場合はアップデートを行います。
      AMDの公式ウェブサイトやデバイスマネージャーからドライバーのアップデートを確認できます。

    2. **グラフィックカードドライバの再インストール：** もし最新のドライバに更新しても問題が解決しない場合は、
      グラフィックカードのドライバをアンインストールし、再度インストールし直すことを試みてください。

    3. **Windowsのアップデート：** Windowsが最新の状態であることを確認してください。
      Windows Updateを通じて最新のパッチやアップデートを適用します。

    4. **ハードウェアのトラブルシューティング：** 物理的なハードウェアに問題がある可能性もあります。
      可能であれば、別のモニターを接続して問題が続くか確認してみてください。
      また、グラフィックカード自体が故障している可能性もあります。

    以上の手順を試しても問題が解決しない場合は、専門家に相談するか、さらに詳細なシステムの診断が必要かもしれません。
    ```
1. 少し癖のあるディスプレイにUSB→HDMIで繋いでいる部分が怪しそう。。
それを外したらクラッシュしなくなりました！！🙌

# 今回の教訓
その1：グラボ周りはOSのクラッシュにつながる可能性が高いと再認識。特に高解像度＆デュアル（トリプル）のように負荷がかかる時は注意。

その2：**Minidump→WinDbg→ChatGPT の解析は最強**！👍
ブルースクリーンや謎のクラッシュ時に思い出そう。
WinDbgは他にも使いこなせると便利そう。