我正在使用
colcon
为我的 ROS2 应用程序运行测试。
到目前为止我还没有遇到任何问题,但是现在添加了一个简单的固定装置之后
class ElectionTest : public ::testing::Test {
protected:
ElectionModule core_;
};
和相关测试,底层 GTest 似乎正在崩溃:在测试摘要中我看到
[ RUN ] ElectionTest.CantPrepareTopics
-- run_test.py: return code -11
-- run_test.py: generate result file '/home/slim71/Documents/git/SpartanLIFT/build/pelican/test_results/pelican/pelican_test.gtest.xml' with failed test
-- run_test.py: verify result file '/home/slim71/Documents/git/SpartanLIFT/build/pelican/test_results/pelican/pelican_test.gtest.xml'
当然一切都会停止。代码
-11
应该是SEGFAULT
,我不知道从哪里来的。
在这里和那里介绍一些
cout
,我可以看到调用对象析构函数后发生崩溃,但随后我不知道问题是什么。
如果在测试结束之前调用 ElectionModule
析构函数,我的猜测是我的类没有问题......
有什么方法可以调试或了解更多吗?
最终我的猜测是错误的! 这确实是由于我的代码(说实话这始终是最可能的解释):在使用指针中确实存在一些问题,所以如果我至少共享其中的一部分会更好..
准确地说,以防其他人在这个问题上犯错:它看起来像是我的代码之外的东西,因为它是在析构函数的最后调用的。我使用
RCLCPP_DEBUG_STREAM
和指向 rclcpp::Logger
的空指针。我添加了一个布尔检查,又名 if(logger_)
,但由于 logger_
没有初始化为 nullptr
我猜这里那里布尔转换通过了,并且代码尝试访问一些受保护的内存。 绝对是我的错!
我从中得到的最有用的东西(以防万一,我会分享)是如何正确调试 colcon test
使用的
ROS2可执行文件:
CMakeLists.txt中添加
set(CMAKE_BUILD_TYPE Debug)
。colcon test
并检查摘要,就像我一样)gdbtui /path/to/test_exe
好吧,我想我由此得到的就是名誉上的损失! ́_(ツ)_/́