通过 colcon 启动的 GTest 获得 SEGFAULT

问题描述 投票:0回答:1

我正在使用

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
析构函数,我的猜测是我的类没有问题......

有什么方法可以调试或了解更多吗?

googletest ros2 colcon
1个回答
0
投票

最终我的猜测是错误的! 这确实是由于我的代码(说实话这始终是最可能的解释):在使用指针中确实存在一些问题,所以如果我至少共享其中的一部分会更好..

准确地说,以防其他人在这个问题上犯错:它看起来像是我的代码之外的东西,因为它是在析构函数的最后调用的。我使用

RCLCPP_DEBUG_STREAM
和指向
rclcpp::Logger
的空指针。我添加了一个布尔检查,又名
if(logger_)
,但由于
logger_
没有初始化为
nullptr
我猜这里那里布尔转换通过了,并且代码尝试访问一些受保护的内存。 绝对是我的错!

我从中得到的最有用的东西(以防万一,我会分享)是如何正确调试 colcon test 使用的

ROS2
可执行文件:

  1. 确保编译可执行文件带有调试信息,即通过在
    CMakeLists.txt
    中添加set(CMAKE_BUILD_TYPE Debug)
  2. 获取已编译可执行文件的路径(例如,您可以手动启动
    colcon test
    并检查摘要,就像我一样)
  3. 只需使用适当的命令在调试器中启动该可执行文件即可!我用过
    gdbtui /path/to/test_exe



好吧,我想我由此得到的就是名誉上的损失! ́_(ツ)_/́

© www.soinside.com 2019 - 2024. All rights reserved.