gdb和GPS:无法在属于受保护类型Ada对象的函数或过程上设置断点

时间:2010-08-19 21:52:38

标签: 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很困惑。我在.adb文件的20001处指定了一个bp,但是gdb回应说它已经将bp设置为相应广告文件的20001 - 它没有那么多行。

是什么给出了?

4 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

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

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

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]

答案 2 :(得分:0)

  

我希望那里的某个人能激发他们的gdb,并尝试在受保护类型的成员函数或过程上设置bp。

我使用dining philosophers成功尝试了此操作,打破了protected type Stickchop的正文。我在Mac OS X上使用GNAT 4.3.4,在Ubuntu 10上使用4.4。

附录:

$ gdb --version
GNU gdb 6.3.50-20050815 (Apple version gdb-962) (Sat Jul 26 08:14:40 UTC 2008)
Copyright 2004 Free Software Foundation, Inc.
$ gnat --version
GNAT 4.3.4 20090621 (prerelease) [gcc-4_3-branch revision 148757]
Copyright 1996-2007, Free Software Foundation, Inc.

答案 3 :(得分:0)

以下是我的问题的更新。

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

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

我正在使用相同的gdb,GPS和&amp;编译器在每种情况下切换,它适用于小程序,但不适用于大型程序。

如果我有,我会发布我的结果。

感谢所有回复者。

汤姆