gdb和GPS:无法在作为受保护类型Ada对象一部分的函数或过程上设置断点

gdb和GPS:无法在作为受保护类型Ada对象一部分的函数或过程上设置断点,gdb,breakpoints,ada,Gdb,Breakpoints,Ada,我有一个受保护的对象,它在接口中显示函数和过程。 在gdb中,当我在其中一个的第一行设置一个bp时,我会得到奇怪的结果 以下是我的gdb控制台中的一个片段: (gdb) (gdb) b database-access_manager.adb:20001 Breakpoint 3 at 0x1a10588: file y:/svs/central_switch/controller/database/ database-access_manager.ads, line 20001. (gdb) (

我有一个受保护的对象,它在接口中显示函数和过程。 在gdb中,当我在其中一个的第一行设置一个bp时,我会得到奇怪的结果

以下是我的gdb控制台中的一个片段:

(gdb) (gdb) b database-access_manager.adb:20001 Breakpoint 3 at 0x1a10588: file y:/svs/central_switch/controller/database/ database-access_manager.ads, line 20001. (gdb) (gdb) (gdb)b数据库访问管理器。亚洲开发银行:20001 0x1a10588处的断点3:文件y:/svs/central_switch/controller/database/ database-access_manager.ads,第20001行。 (gdb) 您可以看到gdb被搞糊涂了。我在.adb文件的20001处指定了一个bp,但gdb回应说,它已将相应ads文件的bp设置为20001处,而ads文件没有那么多行


什么原因?

说明
.ads
文件不会恰好定义或使用泛型,对吗

我还没有找到一个能够很好地处理Ada泛型的调试器。编译器通常会创建大量半不可见的代码,这会混淆调试器。我怀疑C++模板有相同的问题。
另一种可能性是,您正在查看的源文件自编译程序以来已被修改。

在Windows上运行GNAT Pro 6.3.1(我意识到这不是一个理想的数据点!)这工作正常

我确实注意到,当我在子程序规范上请求一个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控制台显示(对于
Put

在运行时,确实有两个中断:

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
受保护对象处的断点1(=…,v=42)。adb:4
(gdb)续
断点1,protected_object.po.put(=…,v=42)位于protected_object.adb:6

版本:GNU gdb(gdb)7.0.1,用于GNAT Pro 6.3.1(20100112)[修订版:158983]

以下是关于我的问题的更新

我用访问方法创建了一个受保护的类型,并在一个小main中使用它,发现我的示例受保护类型中的断点工作得很好

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

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

如果我有结果,我会把结果公布出来

感谢所有的回复者


汤姆

编辑;如果不正确,请还原。那么,当您运行代码时,它是否在某行中断?(我猜可能不会,或者你不会在这里问:-)如果你在受保护的身体内的其他线路上设置中断,会怎么样?还是在主体内调用的子程序内?正如你所看到的,我真的不能回答“给了我什么?”但当面对这种情况时,我会尝试着休息一下。这是一个大文件!我这里没有超过6K的东西。它在远程文件系统上并不重要,但您可以尝试将源代码移动到
C:
。哇,您正在尝试调试一个20K+行的源文件?我的同情。我当然希望这是机器生成的源代码。否则,您真的应该从中创建一些子包。我开始想把超过1K的东西分开。我没有使用通用的。图像文件是新构建的。我希望有人会激发他们的gdb,并尝试在受保护类型的成员函数或过程上设置bp。
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