3

WinDBG を使用して JNI 経由で Java ベースのサービスのプロセスで実行されている C++ コンポーネントのアクセス違反エラーをデバッグしようとしています。私が現在直面している2つの問題があります:

  1. Java 自体は、初回アクセス違反の例外を使用して内部スレッドの同期を行うため (少なくともそのように思われます)、すべての初回アクセス違反を中断することはできません (Java バグ データベースによると、これは意図された動作であるため、修正を期待するべきではありません)
  2. 例外は外部コードで処理されます (C++ コードの誤動作から運用環境を保護する必要があります)。

現在、Java の AV と私のものを区別する方法が 1 つあります。Java は、シンボルがロードされていないモジュールに属するアドレス、またはメモリの他のポイントで発生しており、発生する AV をキャッチすることに興味があります。シンボルがロードされている場所で。

私はWinDbgでそれを達成する方法についてすべての要素を持っているようですが、それらを一緒に組み立てることはできません:

sxe -c ".if (ln) {gN}" av

問題は、.if ステートメントで ln コマンドの入力を指定できないことです (式が必要なため)。また、ln の出力が空かどうかを確認する方法もわかりません。

4

2 に答える 2

4

面白いケース!lnを使用して出力を確認すると、非常に遅くなると思います(また、その方法もわかりません)。少し異なるアプローチ:疑似@$ipには例外のアドレスが含まれている必要があります

First chance exceptions are reported before any exception handling.
 <cut cut >
 eip=0041625d
 0:000> r @$ip
 $ip=0041625d

リベースユーティリティを使用して、.dllのデフォルトのロードアドレスを高い値に変更し、それらがすべてそこにロードされることを期待します。

次に、次のテストを実行できます:@ $ ip>“ RebaseAddr” </ p>

于 2012-06-07T12:30:02.373 に答える
0

jvm.dll をロードしてそれを呼び出すネイティブ C++ サービスがあります。それからの大量の AV :-(. 幸いなことに、それらは常に jvm.dll 内の最大 2 つの異なる命令からのsxe -c ".if (@eip == <addr1>) || (@eip == <addr2>) {gn}" avものでした。

于 2012-06-08T13:51:24.507 に答える