1

我有一个受保护的对象,它在其界面中呈现函数和过程。在 gdb 中,当我在其中一个的第一行设置一个 bp 时,我得到了奇怪的结果。

这是我的 gdb 控制台的一个片段:

(gdb)
(gdb) b 数据库-access_manager.adb:20001
0x1a10588 处的断点 3:文件 y:/svs/central_switch/controller/database/
database-access_manager.ads,第 20001 行。
(gdb)

你可以看到gdb很困惑。我在 .adb 文件的 20001 处指定了一个 bp,但 gdb 回应说它已将 bp 设置在相应广告文件的 20001 处——它没有那么多行。

是什么赋予了?

4

3 回答 3

1

.ads文件不会碰巧定义或使用泛型,对吗?

我还没有找到一个可以很好地处理 Ada 泛型的调试器。编译器经常会创建一大堆半不可见的代码,让调试器感到困惑。我怀疑 C++ 模板也有同样的问题。

另一种可能性是您正在查看自编译程序以来已修改的源文件。

于 2010-08-23T13:50:04.707 回答
1

使用 GNAT Pro 6.3.1 在 Windows 上运行(我意识到这对你来说不是一个理想的数据点!)这很好用。

我确实注意到,当我在子程序规范中请求一个 bp 时,GDB 有效地设置了两个 bp,一个在规范中,一个在第一个语句中:所以,给定

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

版本:GNAT Pro 6.3.1 (20100112) [rev:158983] 的 GNU gdb (GDB) 7.0.1

于 2010-08-24T11:51:33.320 回答
0

这是我的问题的更新。

我用访问方法创建了一个受保护的类型,并在一个小主程序中使用它,发现我的示例受保护类型中的断点工作正常。

现在我试图理解为什么在我公司非常庞大的构建环境中,断点不起作用。

我在每种情况下都使用相同的 gdb、GPS 和编译器开关,它适用于小程序,但不适用于大程序。

我会在/如果有任何结果时发布我的结果。

感谢所有的回复者。

汤姆

于 2010-08-26T13:02:56.767 回答