GDB и GPS: невозможно установить точку останова для функции или процедуры, которая является частью объекта Ada защищенного типа - PullRequest
1 голос
/ 20 августа 2010

У меня есть защищенный объект, который представляет функции и процедуры в своем интерфейсе.В 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 на 20001 для файла .adb, но gdb ответил, что он установил bp на 20001 для соответствующего рекламного файла - у которого не так много строк.

Что дает?

Ответы [ 4 ]

1 голос
/ 24 августа 2010

Работа в Windows с GNAT Pro 6.3.1 (я понимаю, что это не идеальная точка данных для вас!) Это работало нормально.

Я заметил, что когда я запрашивал 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 для GNAT Pro 6.3.1 (20100112) [рев: 158983]

1 голос
/ 23 августа 2010

Этот .ads файл не может быть определением или использованием универсального шаблона, не так ли?

Мне еще предстоит найти отладчик, который очень хорошо обрабатывает универсальные шаблоны Ada.Компилятор часто создает массу полу-невидимого кода, который сбивает с толку отладчиков.Я подозреваю, что шаблоны C ++ имеют ту же проблему.

Другая возможность состоит в том, что вы просматриваете исходный файл, который был изменен с момента компиляции вашей программы.

0 голосов
/ 26 августа 2010

Вот обновление по моей проблеме.

Я создал защищенный тип с методами доступа и использовал его в небольшой сети, и обнаружил, что точки останова в моем примере защищенного типа работают нормально.

Теперь я пытаюсь понять, почему в контексте очень большой сборки моей компании контрольные точки не работают.

Я использую одни и те же переключатели gdb, GPS и компилятор в каждом случае, и это работает для маленькой программы, но не для большой.

Я опубликую свои результаты, когда / если они будут.

Спасибо всем ответчикам.

Tom

0 голосов
/ 23 августа 2010

Я надеюсь, что кто-то там зажжет свои gdb, а также попытается установить bp для функции-члена или процедуры защищенного типа.

Я успешно попробовал это с столовыми философами , сломавшими тело protected type Stick в chop. Я использую GNAT 4.3.4 на Mac OS X и 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.

...