调试波形组件

Debugging Waveform Components

RedHawk IDE 支持使用集成到 IDE 中的 gdb 进行调试,但手册只讨论了使用沙箱进行调试。当然,Gdb 本身能够附加到一个已经 运行 的进程,甚至可以附加到远程机器上的一个进程 运行。是否可以使用 RedHawk/Eclipse 中集成的 gdb 来调试在本地计算机或远程目标的域中启动的 运行 波形中的组件之一,或者我必须在 RedHawk 之外使用 gdb 与整合?

在实时域中调试需要几个步骤才能使您的组件在调试器中 运行。它不是最直接的,但它是可行的,如果您在生产环境而不是沙箱中需要它,有时它是调试行为的唯一方法。我在 REDHAWK 1.10 系列中使用了这些步骤。

首先,您需要重新配置组件以通过脚本启动。如果您正在寻找示例,这基于 Java 组件的代码生成器模板。您需要将一个名为 debug.sh 的新文件添加到项目的实现文件夹(在我的示例中为 'cpp')。添加以下内容:

#!/bin/sh
mydir=`dirname [=10=]`
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>

注意 localfile 现在指向实现目录(不是可执行文件),入口点指向 debug.sh.

现在,确保 gdbserver 安装在最终 运行 安装组件的机器上(带有 GPP 的机器)。例如,在 CentOS 6 上:

sudo yum install gdb-gdbserver

对于下一部分,您实际上需要打开两个 IDE。使用#1,我们将调试组件。对于#2,我们将执行领域功能。我假设您在 IDE #1.

的工作区中将您的组件作为项目

在 IDE#1 中,将您的组件安装到目标 SDRROOT。接下来,select 在 Project Explorer 中右键单击您的项目,然后 select "Debug As" -> "Debug Configurations..."。双击 "C/C++ Remote Application"。将创建一个配置并填充您的组件项目的详细信息。切换到 "Debugger" 选项卡,然后 select 切换到 "Debugger Options" 下的 "Connection" 选项卡。更改主机名以匹配组件将 运行 所在的 GPP(如果不在您的本地主机上),并更改端口以匹配 debug.sh 脚本文件(在我的示例中为 2345)。保持此对话框打开。

切换到IDE #2。如果需要,请使用 GPP 启动域和设备管理器(右键单击 "Target SDR"、select "Launch...")。启动包含您的组件的波形(右键单击域,然后 "Launch Waveform...")。您会注意到启动对话框将暂停,等待波形启动。这是因为您的组件已暂停在等待调试器连接的 main() 方法中,并且尚未注册到域。

切换到 IDE #1。单击对话框中的 "Debug" 按钮。您应该已连接到该进程,IDE 将提示您切换到调试透视图,您将看到您位于组件的 main() 方法中。该组件需要在 60 秒内注册,否则框架将假定它无法启动并超时。我通常单击 运行 按钮以允许组件完成其初始化。您将在 IDE #2 中看到发射完成,并打开波形图。

此时,很容易在代码中设置断点(尤其是服务函数、属性更改通知等)和调试。如果您在组件的初始化阶段有需要调试的项目,您可能需要自定义安装框架,该框架被修改为不会超时等待组件注册。

我修改了脚本以检查执行时传递给组件的属性,并决定是在 gdb 下还是直接执行它。这允许脚本和对 spd.xml 的更改保留在原位,并通过在组件的 属性 页面中添加或删除 属性 来打开或关闭调试。 My 属性 在存在时还指定了 gdbserver 应该使用的端口,并且如果组件在波形中有多个实例,还允许指定要调试的实例。我使用 属性 gdbn 来调试第 n 个实例。这使得在域中调试组件 运行 更加实用。