REDHAWK组件调试
REDHAWK component debugging
我无法进行调试。
我使用的是 2.1.0 版的 REDHAWK,我正在尝试创建自定义组件。
我可以获得 运行 的发布版本并开始工作。
这就是我所做的,我创建了一个非常基本的自定义组件,它接受输入,将其乘以 2 并将其推送到输出流,非常简单。现在我尝试在沙箱中以调试模式 运行 这个组件,立即崩溃。我唯一能看到的是调用堆栈的最后一个条目,即
boost::shared_ptr<rh_logger::Logger>::operator->() at shared_ptr.hpp:653
如果我选择 运行 我的组件而不调试,一切正常。它甚至做乘法。
我不知道发生了什么,显然这个智能指针 class 进行了断言检查以验证它 returns 的指针并最终崩溃,因为它为零。作为 -> 操作员,这似乎很危险。 SIGSEGV 是抛出的错误,我想知道 BOOST_ASSERT 是否会导致失败?
操作系统是 CentOS 7 64 位,运行在普通桌面英特尔处理器上运行,不记得是哪个了。
我按照 REDHAWK 手册 2.2 部分的说明通过下载存储库安装了 REDHAWK。
新组件是使用 REDHAWK IDE(基于 eclipse)创建的,我选择 C++ 作为程序语言。它似乎是一个共享库,当我 运行 它时,启动了一个名为 ComponentHost 的进程。
我试图通过右键单击“项目”菜单中的组件并选择“调试为 - 沙盒中的组件”来启动沙盒中的组件。 运行 Release 模式下的组件可以这样使用
我可以通过 Python 沙箱调试组件,所以只有几个变量可以帮助缩小范围,我的测试系统在 []:
- 哪个操作系统? [CentOS 7]
- REDHAWK 从源代码还是 RPM 安装? [每分钟转数]
- 这是一个新的基于 C++ 共享库的组件(入口点类型是 "SharedLibrary")还是可执行文件("Executable")? [两者]
- 您将如何启动该组件?通过 Python 沙箱,以 "debugger='gdb'" 作为启动参数?还有其他启动参数吗?
另一种可能的调试方法是正常启动组件,然后从另一个终端附加 GDB window。
首先找到组件进程:
如果是共享库:
ps -o pid,comm -C ComponentHost
如果它是可执行文件(其中“”是组件可执行文件的名称):
ps -o pid,cmd -C <name>
希望您清楚哪个进程是您的目标组件。如果您 运行 来自同一个沙箱的多个共享库组件,它们都将属于同一个 ComponentHost 实例。
然后,使用 GDB 附加到进程:
gdb -p <pid>
这基本上就是沙箱附加 GDB 的方式;但是,运行 它独立地允许您在附加调试器之前先根据自己的喜好设置流程。
我无法进行调试。
我使用的是 2.1.0 版的 REDHAWK,我正在尝试创建自定义组件。
我可以获得 运行 的发布版本并开始工作。
这就是我所做的,我创建了一个非常基本的自定义组件,它接受输入,将其乘以 2 并将其推送到输出流,非常简单。现在我尝试在沙箱中以调试模式 运行 这个组件,立即崩溃。我唯一能看到的是调用堆栈的最后一个条目,即
boost::shared_ptr<rh_logger::Logger>::operator->() at shared_ptr.hpp:653
如果我选择 运行 我的组件而不调试,一切正常。它甚至做乘法。
我不知道发生了什么,显然这个智能指针 class 进行了断言检查以验证它 returns 的指针并最终崩溃,因为它为零。作为 -> 操作员,这似乎很危险。 SIGSEGV 是抛出的错误,我想知道 BOOST_ASSERT 是否会导致失败?
操作系统是 CentOS 7 64 位,运行在普通桌面英特尔处理器上运行,不记得是哪个了。
我按照 REDHAWK 手册 2.2 部分的说明通过下载存储库安装了 REDHAWK。
新组件是使用 REDHAWK IDE(基于 eclipse)创建的,我选择 C++ 作为程序语言。它似乎是一个共享库,当我 运行 它时,启动了一个名为 ComponentHost 的进程。
我试图通过右键单击“项目”菜单中的组件并选择“调试为 - 沙盒中的组件”来启动沙盒中的组件。 运行 Release 模式下的组件可以这样使用
我可以通过 Python 沙箱调试组件,所以只有几个变量可以帮助缩小范围,我的测试系统在 []:
- 哪个操作系统? [CentOS 7]
- REDHAWK 从源代码还是 RPM 安装? [每分钟转数]
- 这是一个新的基于 C++ 共享库的组件(入口点类型是 "SharedLibrary")还是可执行文件("Executable")? [两者]
- 您将如何启动该组件?通过 Python 沙箱,以 "debugger='gdb'" 作为启动参数?还有其他启动参数吗?
另一种可能的调试方法是正常启动组件,然后从另一个终端附加 GDB window。
首先找到组件进程:
如果是共享库:
ps -o pid,comm -C ComponentHost
如果它是可执行文件(其中“”是组件可执行文件的名称):
ps -o pid,cmd -C <name>
希望您清楚哪个进程是您的目标组件。如果您 运行 来自同一个沙箱的多个共享库组件,它们都将属于同一个 ComponentHost 实例。
然后,使用 GDB 附加到进程:
gdb -p <pid>
这基本上就是沙箱附加 GDB 的方式;但是,运行 它独立地允许您在附加调试器之前先根据自己的喜好设置流程。