ダンプファイル (Memory Dump) や CLR Profiler Trace の採取で 実用的に調査できる状態 を、 ボタン操作で意図的に作り出す検証エリアです。各シナリオは ON/OFF できます。
processId と machineName で確認し、同じ PID に対してダンプを採ってください。
dotnet-dump collect -p <pid> (Kudu の Powershell から実行可能)# Kudu PowerShell (App Service Diagnostics > Debug Console > PowerShell)
cd D:\home\
dotnet tool install --tool-path D:\home\tools dotnet-dump
.\tools\dotnet-dump.exe collect -p <pid> --type Heap
# 出力されたファイルを Kudu の File Manager からダウンロード
# dotnet-dump analyze <dumpfile> で起動した後:
clrstack -all # 全マネージドスレッドのスタック
threads # スレッド一覧
syncblk # ロック / Monitor 取得状況 (デッドロック調査)
dumpheap -stat # ヒープ統計 (メモリリーク調査)
dumpheap -stat -min 85000 # LOH のみ
gcroot <addr> # 該当オブジェクトの GC ルート
runaway # スレッドごとの CPU 時間 (CPU hotspot 調査)
指定 rate で byte[] を内部 List に蓄積し続けます。chunkKb=85 以上で LOH (Large Object Heap) 行き。
maxMb 到達で自動停止。Stop の keep=true はバッファを保持したまま停止 (ダンプ用にメモリを握ったまま観察可能)。
Math.Sqrt の tight loop を threads 本の Task で並列起動。ms 経過で自動 Cancel。
Profiler を開始してからこのボタンを押すと、hotspot がきれいに採取できます。
background Task が ManualResetEventSlim.Wait() でハングします (HTTP は即返却)。
!syncblk / !threads / clrstack でブロック状態が見えます。
id を指定すると後で release?id=... で個別解除。
request スレッドを Thread.Sleep(ms) でホールド。
HTTP クライアントからは「応答が返ってこない」状態。
230 秒超を要求すると App Service フロントエンドが 502 を返してきますが プロセス側のスレッドは保持されたまま。