2010-08-19 60 views
1

我有一个受保护的对象,在其界面中显示功能和过程。 在gdb中,当我在其中一个的第一行设置一个bp时,我会得到奇怪的结果。gdb和GPS:不能在被保护类型Ada对象的一部分功能或过程上设置断点

下面是从我的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回应说它已将相应广告文件的20001处的bp设置为 - 它没有那么多行。

什么给?

+0

编辑;如果不正确请回复。 – trashgod 2010-08-20 12:06:07

+1

那么,当你运行代码时,它会在* some *行中出现吗? (我猜可能不会,或者你不会问这里:-) 如果你在被保护体内的其他行上设置了中断,该怎么办?或者在体内调用的子程序中?如你所见,我无法真正回答“是什么给了?”但这些都是我面对这种情况时试图获得休息的种类。 – 2010-08-20 12:11:39

+0

这是一个很大的文件!我在这里没有超过6K的东西。不要紧,它在远程文件系统上,但可以尝试将源移到'C:'。 – trashgod 2010-08-20 12:47:30

回答

1

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

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

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

+0

我没有使用泛型。图像文件是新建的。 我希望那里有人会引发他们的gdb,并尝试设置一个成员函数或受保护类型的过程上的基点。 – Tom 2010-08-23 19:16:52

0

我希望有人能激发他们的gdb也尝试设置一个保护类型的成员函数或过程的基点。

dining philosophers成功尝试这一点,在chop打破的protected type Stick身体。我使用的是Mac OS X GNAT 4.3.4和4.4在Ubuntu 10

附录:

 
$ 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. 

+0

现在很有趣。 你有什么版本的gdb? 我在GNU GPL 2010(20100603)[rev = gdb-7.1-ref-90-g6d5b58a]上使用GNU gdb(GDB)7.1。我的GPS和你的一样。我敢打赌你的gdb也是7.1。 也许这是一个Windows问题? – Tom 2010-08-23 20:43:01

+0

现在的问题是 “有没有人在那里成功地设置并在一个受保护类型的函数或过程上在Windows上的gdb命中bp?” – Tom 2010-08-23 20:45:00

+0

@Tom:见上。如果没有'@',只有作者会收到你的评论通知。用新的发现编辑你的问题将会使其成为活跃的问题。 – trashgod 2010-08-23 23:02:37

1

与GNAT Pro的6.3.1运行在Windows(我知道这是不是一个理想的数据指向你!)这工作得很好。

我也注意到,当我要求对子程序规范BP,GDB有效地设置两个基点,一是在规范,一个在第一个语句:那么,鉴于

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 

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

0

以下是我的问题的更新。

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

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

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

如果我有任何问题,我会发布我的结果。

感谢所有的repliers。

汤姆