RedHawk IDE поддерживает отладку с помощью gdb, интегрированного в IDE, но в руководстве обсуждается это только в песочнице. Сам Gdb, конечно, может подключаться к уже работающему процессу и даже к процессу, запущенному на удаленной машине. Можно ли использовать gdb как интегрированный в RedHawk/Eclipse для отладки одного из компонентов в работающем сигнале, запущенном в домене на локальном компьютере или удаленной цели, или я должен просто использовать gdb вне RedHawk с интеграцией?
Отладка компонентов сигналов
Ответы (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, и откроется диаграмма формы волны.
На этом этапе легко установить точки останова в коде (особенно в сервисной функции, уведомлениях об изменении свойств и т. д.) и выполнить отладку. Если у вас есть элементы, которые необходимо отладить на этапе инициализации вашего компонента, вам может потребоваться выборочная установка платформы, которая изменена, чтобы не было тайм-аута ожидания регистрации компонентов.
Я адаптировал сценарий, чтобы проверить свойства, передаваемые компоненту при выполнении, и решить, выполнять ли его через gdb или напрямую. Это позволяет сохранить сценарий и изменение в файле spd.xml, а также включить или отключить отладку путем добавления или удаления свойства на странице свойств компонента. Мое свойство, если оно присутствует, также указывает порт, который должен использовать gdbserver, а также позволяет указать, какой экземпляр следует отлаживать, если компонент имеет более одного экземпляра в сигнале. Я использую свойство gdbn для отладки n-го экземпляра. Это делает отладку компонентов, работающих в домене, гораздо более практичной.