0

次のコードがあります。

void func()
{
  try
  {
    f1()
  }
  finally()
  {
     if (resource != null)
       resource.close();
  }
}

私は 3 つのブレークポイントを設定しました。f1() 内の f1() の呼び出し、finally ブロックの if ステートメントです。

finally ブロックのブレークポイントにヒットしていないようです。f1() 内のブレークポイントに到達した後、次のコマンドを使用してステップ実行すると、実際に最終ブロックを通過することになります。

また、finally ブロックの両方の行にブレークポイントを配置すると、ブレークポイントは実際に最初の行にヒットします。

これが JDB のバグによるものかどうかはわかりません。これが既知の問題なのか、何か不足しているのか、誰か教えてもらえますか?

LinuxでJDK 6を使用しています。

4

1 に答える 1

5

どのような予期しない動作が発生しているのかはよくわかりませんが、JDB では、if、finally、または final 内の if のデバッグに問題はありません。明らかなブレークポイントがスキップされている場合は、実行中のバイトコードとは異なるソース コードを参照している可能性があります。で逆アセンブルすることにより、バイトコードの行番号を確認することができます

javap -c -l <simple class name>

クラスファイルと同じディレクトリにあります。として実行することもできます

javap -c -l -classpath <build dir> <fully qualified class name>

各メソッドに含まれるすべての命令が数値ラベルで表示されます。これらのラベルをソースコードの行番号に関連付ける「LineNumberTable」があります。注: 通常、ソース コード行ごとに多くのバイトコード命令があります。

于 2011-07-30T03:31:59.257 に答える