知識マップ: 産業用カメラ長期稼働クラッシュ調査 - ハンドルリーク編

記事「産業用カメラ長期稼働クラッシュ調査 - ハンドルリーク編」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事は、産業用カメラ制御アプリが約1か月の連続稼働後に突然落ちた事例をもとに、ハンドルリークの見つけ方とログ設計を整理したものです。ハンドルリークはtimeoutやreconnectのfailure pathでCreateEventのハンドルがCloseHandleされずに漏れることで起き、戻らないHandle Countとして表れ、GUIが同居するアプリではGDIオブジェクトの上限に先に達して二次障害として表面化します。対策はRAII型やfinallyで所有権と解放の責務を近づけ、CloseHandleの呼び忘れそのものを防ぐことです。長時間運転後クラッシュの切り分けでは、月単位の再現を待たずfailure pathを短いループで大量に踏み、Handle Count・Private Bytes・Thread Countと構造化ログを併せて見ることが土台になり、後編のApplication Verifierはその上に乗る手段として位置付けられます。

産業用カメラ長期稼働クラッシュ調査(ハンドルリーク編)の知識マップ長時間運転後クラッシュの切り分けでHandle CountとPrivate Bytes・Thread Countを併せて見ること、failure pathでの解放漏れがハンドルリークを経て二次障害として表面化すること、RAIIとCloseHandleによる防止、構造化ログとApplication Verifierの位置付けを示す図。原因になり得るで確認できるで確認できる前提とする推奨される対応より先に行うべき防止する利用する軽減する原因になり得る推奨される対応防止する原因になり得る推奨される対応推奨される対応推奨される対応推奨される対応推奨される対応ハンドルリークHandle Countfailure path(異常系の途中失敗経路)メモリリークPrivate BytesCreateEventCloseHandle構造化ログ(structured log)Application VerifierRAII(Resource Acquisition Is Initialization)二次障害(secondary failure)GDIオブジェクト長時間運転後クラッシュの切り分けThread Count

概念間の関係(全18件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

ハンドルリーク
参照カウントやハンドルカウントの数え違いなどにより、不要になったハンドル(ファイル・イベント・スレッド・GDIオブジェクト・アクセストークンなどカーネルオブジェクトへの参照)が解放されずに積み上がっていく状態。
Handle Count
プロセスが現在開いているハンドルの総数を表す、Windowsプロセスの計測値。
failure path(異常系の途中失敗経路)
timeout・reconnect・early returnなど、正常系ではなく処理が途中で失敗して抜けるコード経路。資源の解放漏れが起きやすい。
メモリリーク
確保したメモリを解放し忘れ、Private BytesやCommitが増え続ける現象。
CreateEvent
イベントオブジェクトを作成し、そのハンドルを返すWin32 API。呼び出し元は使用後にCloseHandleでハンドルを解放する必要がある。
構造化ログ(structured log)
文章ではなくkey=valueのように項目を決めて出力し、あとで機械的に集計できるログの形式。
RAII(Resource Acquisition Is Initialization)
オブジェクトの生成時に資源を確保し、デストラクタでの解放を保証することで、途中失敗時にも資源が漏れないようにするC++の設計パターン。
Application Verifier
Windowsのuser-modeアプリに対するランタイム検証ツールで、OS API利用や資源の扱い方を監視し誤用の検出や意図的な失敗の注入を行う。
CloseHandle
プロセスのハンドルテーブルからエントリを1つ削除するWin32 API。「ファイルを閉じる」ことそのものではない。
GDIオブジェクト
ペン・ブラシ・デバイスコンテキストなどGDIが管理する描画資源で、プロセスあたりの既定上限に達するとそれ以上作成できなくなる。
Private Bytes
プロセスが専有しているコミット済みメモリ量を表す、Windowsプロセスの計測値。
Thread Count
プロセスが持つスレッド数を表す計測値。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。