我有一个受保护的对象,它在其界面中显示了函数和过程。 在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 - 它没有那么多行。
是什么给出了?
答案 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 Stick
中chop
的正文。我在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;编译器在每种情况下切换,它适用于小程序,但不适用于大型程序。
如果我有,我会发布我的结果。
感谢所有回复者。
汤姆