Windowsのサービスセッションでプログラムがエラーメッセージを表示して止まっている場合に、メモリダンプからメッセージ内容を知る手順をご紹介いたします。
Windows Server上のサービスセッションにて、VBScriptを実行したwscript.exeが長時間止まったままになっていました。
メモリダンプを取得し、スタックを確認すると、メッセージボックスを表示して入力待ちになっていることがわかります。
0:000> k
# Child-SP RetAddr Call Site
00 0000005b`2a6ff198 00007fff`7eedb3dc win32u!NtUserWaitMessage+0x14
01 0000005b`2a6ff1a0 00007fff`7eedb917 user32!DialogBox2+0x254
02 0000005b`2a6ff240 00007fff`7eefef76 user32!InternalDialogBox+0x14b
03 0000005b`2a6ff2a0 00007fff`7eefd8b1 user32!SoftModalMessageBox+0x836
04 0000005b`2a6ff3e0 00007fff`7eefe6a5 user32!MessageBoxWorker+0x341
05 0000005b`2a6ff590 00007fff`7eefe72e user32!MessageBoxTimeoutW+0x1a5
06 0000005b`2a6ff690 00007ff7`c1277f6d user32!MessageBoxW+0x4e
07 0000005b`2a6ff6d0 00007ff7`c12781b5 wscript!CWinHost::PrintF+0x15d
08 0000005b`2a6ff770 00007ff7`c127c9bc wscript!CWinHost::ReportError+0x55
09 0000005b`2a6ff7d0 00007ff7`c12797ec wscript!CheckSecurity+0x98
0a 0000005b`2a6ff830 00007ff7`c1276b65 wscript!WinMain+0x250
0b 0000005b`2a6ffba0 00007fff`7e3d4cb0 wscript!WinMainCRTStartup+0x65
0c 0000005b`2a6ffc40 00007fff`8021edcb kernel32!BaseThreadInitThunk+0x10
0d 0000005b`2a6ffc70 00000000`00000000 ntdll!RtlUserThreadStart+0x2b
サービスセッション上に表示されたUIは見ることができませんので、どういったメッセージで止まっているのか確認することができません。
MessageBox APIは内部的に、表示するメッセージ内容のポインタをスタックメモリ上に保存する特性があります。
WinDbgのコマンド
・64bitプロセスの場合「dqu rsp」
・32bitプロセスの場合「ddu esp」
でスタックメモリを閲覧すると、途中でメッセージ内容が表示されます。
「dqu rsp」でEnterキーを押し、次は「dqu」でEnterキー、以降はEnterキーを繰り返し入力するとスタックを閲覧していくことができます。
0:000> dqu rsp
0000005b`2a6ff198 00007fff`7eedb3dc "ἏD䠀쾋..䣿삅蔏﹣.ძ䲋䠤h섕κༀ䐟"
0000005b`2a6ff1a0 00000000`00000000
... 中略 ...
0000005b`2a6ff208 00007fff`7eefcd60 "譈䣄墉䠈梉䠐炉䰘炉䄠䡗.䥀.譍䣸..༏䂄.茀䓪萏."
0000005b`2a6ff210 00000165`8c0895c0 "Dž胈"
0:000> dqu
0000005b`2a6ff218 00007fff`7eefcd60 "譈䣄墉䠈梉䠐炉䰘炉䄠䡗.䥀.譍䣸..༏䂄.茀䓪萏."
0000005b`2a6ff220 00000000`00000000
... 中略 ...
0000005b`2a6ff288 00000000`00000001
0000005b`2a6ff290 00000000`00000000
0:000>
0000005b`2a6ff298 00007fff`7eefef76 "줳.䓿曆ང.䗶ྋݵ蕅䗿䔏䣾..譈䣋ᗿ茲.ἏD䠀උ遶.譌.䣒ᗿ笺.ἏD䴀.ᡴ譈复ΐ䴀얋툳hᴕŻༀ䐟"
0000005b`2a6ff2a0 00000000`00010007
... 中略 ...
0000005b`2a6ff2e8 00000165`8c08b890 "Windows Script Host へのアクセスがこのコンピュータ上で無効にされています。詳細については、"
0000005b`2a6ff2f0 0000005b`00000045
0000005b`2a6ff2f8 00000165`00000082
途中で文字化けした文字列が表示されているのは「dqu」コマンドの動作によるものです。
「dqu」コマンドは、ポインタを文字列の先頭として解釈した表示をするコマンドです。
それが意味のある文字列かどうかは人間が判断しなければなりません。
スタックメモリの[0000005b2a6ff2e8]にある[000001658c08b890]に、意味のありそうな日本語が入っていました。全文を表示させてみましょう。
0:000> du /c100 00000165`8c08b890
00000165`8c08b890 "Windows Script Host へのアクセスがこのコンピュータ上で無効にされています。詳細については、管理者に連絡してください。."
該当環境ではWindows Script Hostが無効になっているようです。
Windows Script Hostは、以下のレジストリ設定で無効にすることができます。
キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows Script Host\Settings
エントリ:Enabled (REG_DWORD)
データ:0 ... WSH無効
1 ... WSH有効(デフォルト)
別の環境にて上記の設定でWindows Script Hostを無効にしてみると、wscript.exe実行時に以下のメッセージボックスが表示されました。これのことですね。


