WinDBG を使用して JNI 経由で Java ベースのサービスのプロセスで実行されている C++ コンポーネントのアクセス違反エラーをデバッグしようとしています。私が現在直面している2つの問題があります:
- Java 自体は、初回アクセス違反の例外を使用して内部スレッドの同期を行うため (少なくともそのように思われます)、すべての初回アクセス違反を中断することはできません (Java バグ データベースによると、これは意図された動作であるため、修正を期待するべきではありません)
- 例外は外部コードで処理されます (C++ コードの誤動作から運用環境を保護する必要があります)。
現在、Java の AV と私のものを区別する方法が 1 つあります。Java は、シンボルがロードされていないモジュールに属するアドレス、またはメモリの他のポイントで発生しており、発生する AV をキャッチすることに興味があります。シンボルがロードされている場所で。
私はWinDbgでそれを達成する方法についてすべての要素を持っているようですが、それらを一緒に組み立てることはできません:
sxe -c ".if (ln) {gN}" av
問題は、.if ステートメントで ln コマンドの入力を指定できないことです (式が必要なため)。また、ln の出力が空かどうかを確認する方法もわかりません。