Отладка компонентов сигналов

RedHawk IDE поддерживает отладку с помощью gdb, интегрированного в IDE, но в руководстве обсуждается это только в песочнице. Сам Gdb, конечно, может подключаться к уже работающему процессу и даже к процессу, запущенному на удаленной машине. Можно ли использовать gdb как интегрированный в RedHawk/Eclipse для отладки одного из компонентов в работающем сигнале, запущенном в домене на локальном компьютере или удаленной цели, или я должен просто использовать gdb вне RedHawk с интеграцией?


person Terry L Anderson    schedule 28.01.2015    source источник
comment
Возможно, вы сможете подключиться к уже запущенному процессу: stackoverflow.com/questions/655853/   -  person Erik Englund    schedule 28.01.2015
comment
Как? Я не нашел способа запустить отладчик в RedHawk с указанием pid или без него, запуская какой-либо компонент как локальный компонент и без консоли, где я мог бы выполнить новое подключение.   -  person Terry L Anderson    schedule 29.01.2015
comment
Я просмотрел документацию Eclipse по запуску отладчика, но ни одно из меню или шагов, которые они описывают, не доступны в RedHawk. Я ничего не вижу о конфигурациях отладки или даже диалоговом окне отладки в Redhawk.   -  person Terry L Anderson    schedule 29.01.2015
comment
Кстати, я получаю ту же ошибку с уровнями журнала в устройствах, что и с компонентами.   -  person Terry L Anderson    schedule 04.12.2018
comment
Мне жаль, что этот комментарий был добавлен к неправильному вопросу   -  person Terry L Anderson    schedule 04.12.2018


Ответы (2)


Отладка в действующем домене требует нескольких шагов, чтобы ваш компонент запустился в отладчике. Это не самый простой, но выполнимый, а иногда и единственный способ отладки поведения, если он вам нужен в производственной среде, а не в песочнице. Я использовал эти шаги с серией REDHAWK 1.10.

Сначала вам нужно перенастроить компонент для запуска через скрипт. Это основано на шаблоне генератора кода для компонентов Java, если вы ищете пример. Вы захотите добавить новый файл в папку реализации вашего проекта ('cpp' в моем примере) с именем debug.sh. Добавьте следующее содержимое:

#!/bin/sh
mydir=`dirname $0`
chmod +x ${mydir}/your_component_executable
exec gdbserver host:2345 ${mydir}/your_component_executable "$@"

Замените your_component_executable на имя вашего компонента. Теперь вам нужно убедиться, что «make install» устанавливает этот скрипт. Добавьте следующее в ваш Makefile.am:

bin_SCRIPTS = debug.sh

Затем отредактируйте файл .spd.xml. Измените элементы localfile и entrypoint. Элемент localfile сообщает REDHAWK, что ExecutableDevice (т. е. ваш GPP) должен скопировать в свою файловую систему, чтобы иметь возможность запускать компонент. Точка входа — это то, что фактически вызывается для запуска процесса. После модификации это может выглядеть примерно так:

<code type="Executable">
  <localfile name="cpp"/>
  <entrypoint>cpp/debug.sh</entrypoint>
</code>

Обратите внимание, что локальный файл теперь указывает на каталог реализации (а не на исполняемый файл), а точка входа указывает на файл debug.sh.

Теперь убедитесь, что gdbserver установлен на машине, на которой в конечном итоге будет запущен компонент (машина с GPP). Например, в CentOS 6:

sudo yum install gdb-gdbserver

В следующей части вам понадобятся две открытые IDE. С # 1 мы будем отлаживать компонент. С # 2 мы будем выполнять функции предметной области. Я предполагаю, что у вас есть компонент как проект в рабочей области в IDE #1.

В среде IDE №1 установите компонент в целевой SDRROOT. Затем выберите свой проект в Project Explorer, щелкните правой кнопкой мыши и выберите «Отладка как» -> «Отладка конфигураций...». Дважды щелкните «Удаленное приложение C/C++». Конфигурация будет создана и заполнена деталями вашего проекта компонента. Перейдите на вкладку «Отладчик» и выберите вкладку «Подключение» в разделе «Параметры отладчика». Измените имя хоста, чтобы оно соответствовало GPP, на котором будет работать компонент (если не на вашем локальном хосте), и измените порт, чтобы он соответствовал файлу сценария debug.sh (2345 в моем примере). Оставьте это диалоговое окно открытым.

Переключитесь на IDE №2. Если вам нужно, запустите свой домен и диспетчер устройств с GPP (щелкните правой кнопкой мыши «Целевой SDR», выберите «Запустить...»). Запустите форму волны, содержащую ваш компонент (щелкните правой кнопкой мыши домен, затем "Запустить форму волны..."). Вы заметите, что диалоговое окно запуска приостанавливается в ожидании запуска сигнала. Это связано с тем, что ваш компонент приостановил выполнение метода main() в ожидании подключения отладчика и не зарегистрировался в домене.

Переключитесь на IDE №1. Нажмите кнопку «Отладка» в диалоговом окне. Вы должны быть подключены к процессу, и IDE предложит вам переключиться в режим отладки, и вы увидите, что находитесь в методе main() вашего компонента. Компонент должен быть зарегистрирован в течение 60 секунд, иначе фреймворк решит, что он не запустился, и время ожидания истекло. Обычно я нажимаю кнопку запуска, чтобы позволить компоненту завершить свою инициализацию. Вы увидите, что запуск завершен в среде IDE #2, и откроется диаграмма формы волны.

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

person Daniel Wille    schedule 04.02.2015
comment
Я путешествовал вдали от своего хоста RedHawk и только сейчас попробовал это. Как вы сказали, эта техника НЕ ​​является прямой, но выполнимой. Я предполагаю, что когда вы выполняете отладку, вам нужно использовать SPD, чтобы не запускать компонент через скрипт. Моя большая проблема — запуск двух IDE. Я никогда не хотел делать это раньше, но попробовал. Когда я пытаюсь запустить другую IDE в той же рабочей области, мне сообщается, что рабочая область занята. Как запустить второй экземпляр? Или достаточно второго окна IDE в том же сеансе? - person Terry L Anderson; 17.02.2015
comment
Нет, еще одного окна в том же экземпляре RedHawk недостаточно. Когда я оставляю это диалоговое окно открытым в IDE#1 и переключаюсь на другое окно IDE, оно блокируется, ожидая выхода из диалогового окна в первом окне. Итак, я думаю, мне нужно каким-то образом запустить другой экземпляр RedHawk в качестве IDE # 2, но, похоже, это не разрешено использовать то же рабочее пространство????? - person Terry L Anderson; 17.02.2015
comment
Для IDE на основе Eclipse требуются уникальные рабочие области — они блокируются при запуске IDE. Поскольку все, что вы будете делать со второй IDE, — это просто использовать ее для взаимодействия с доменом, ей не нужно ничего иметь в рабочей области. Вы можете просто использовать другой каталог. - person Daniel Wille; 20.02.2015
comment
Если вы предпочитаете, а не использовать вторую IDE, вы также можете просто запустить менеджеры домена/устройств через nodeBooter в командной строке и использовать API Python для запуска сигнала в домене. - person Daniel Wille; 20.02.2015

Я адаптировал сценарий, чтобы проверить свойства, передаваемые компоненту при выполнении, и решить, выполнять ли его через gdb или напрямую. Это позволяет сохранить сценарий и изменение в файле spd.xml, а также включить или отключить отладку путем добавления или удаления свойства на странице свойств компонента. Мое свойство, если оно присутствует, также указывает порт, который должен использовать gdbserver, а также позволяет указать, какой экземпляр следует отлаживать, если компонент имеет более одного экземпляра в сигнале. Я использую свойство gdbn для отладки n-го экземпляра. Это делает отладку компонентов, работающих в домене, гораздо более практичной.

person Terry L Anderson    schedule 15.12.2015