1

インターフェイスに関数とプロシージャを表示する保護されたオブジェクトがあります。gdb で、それらの最初の行に bp を設定すると、奇妙な結果が得られます。

これは私の gdb コンソールからのスニペットです:

(gdb)
(gdb) b database-access_manager.adb:20001
0x1a10588 のブレークポイント 3: ファイル y:/svs/central_switch/controller/database/
database-access_manager.ads、20001 行目。
(gdb)

gdb が混乱していることがわかります。.adb ファイルの 20001 に bp を指定しましたが、gdb は対応する ads ファイルの 20001 に bp を設定したと応答しました。これにはそれほど多くの行がありません。

何を与える?

4

3 に答える 3

1

Windows で GNAT Pro 6.3.1 を実行すると (これは理想的なデータ ポイントではないことがわかります)、問題なく動作しました。

サブプログラムの仕様で bp を要求したとき、GDB が効果的に 2 つの bp を設定したことに気付きました。1 つは仕様に、もう 1 つは最初のステートメントにあります。

package body Protected_Object is

   protected body PO is
      procedure Put (V : Integer) is
      begin
         Value := V;
      end Put;
      function Get return Integer is
      begin
         return Value;
      end Get;
    end PO;

end Protected_Object;

GDB コンソールの表示 (for Put)

gdb) break protected_object.adb:4
Breakpoint 1 at 0x401729: file protected_object.adb, line 6. (2 locations)

実行時には、確かに 2 つの中断があります。

Breakpoint 1, <protected_object__po__putP> (<_object>=..., v=42) at protected_object.adb:4
(gdb) cont

Breakpoint 1, protected_object.po.put (<_object>=..., v=42) at protected_object.adb:6

バージョン: GNU gdb (GDB) 7.0.1 for GNAT Pro 6.3.1 (20100112) [rev:158983]

于 2010-08-24T11:51:33.320 に答える
1

その.adsファイルは、たまたまジェネリックを定義または使用していないでしょうか?

Ada ジェネリックをうまく処理できるデバッガーをまだ見つけていません。コンパイラは、多くの場合、デバッガを混乱させる半透明のコードのラフトを作成します。C++ テンプレートにも同じ問題があると思われます。

もう 1 つの可能性は、プログラムがコンパイルされた後に変更されたソース ファイルを見ていることです。

于 2010-08-23T13:50:04.707 に答える
0

これが私の問題に関する最新情報です。

アクセス メソッドを使用して保護された型を作成し、それを小さなメインで使用したところ、保護された型の例のブレークポイントが正常に機能することがわかりました。

現在、会社の非常に大きなビルドのコンテキスト内で、ブレークポイントが機能しない理由を理解しようとしています。

私はそれぞれの場合で同じ gdb、GPS、およびコンパイラ スイッチを使用していますが、小さなプログラムでは機能しますが、大きなプログラムでは機能しません。

結果があれば、いつでも投稿します。

リピーターの皆様ありがとうございました。

トム

于 2010-08-26T13:02:56.767 に答える