ROS2 使用 backtrace 函数无效猜想

博客探讨了在ROS2环境中,使用backtrace和addr2line解析栈函数地址无效的问题,以及通过GDB调试能够获取正常栈信息的情况。指出ROS2节点启动方式与ROS1不同,可能影响地址解析,并怀疑可能是在ROS2执行空间上启动节点导致的。同时,注意到单独运行ROS2执行文件会遇到库依赖问题。作者寻求验证这一假设的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、使用 backtrace 和 backtrace_symbols 打印的栈函数地址,用 addr2line 指令解析无效,已确定编译时加了 -g -ggdb 的 Debug 模式。
在这里插入图片描述
2、使用 ROS2 进入 GDB 调试,可以正常打印栈的函数信息。说明 backtrace 函数在系统环境是起作用,没有阉割和优化的。
(ros2 进入 gdb 模式和 ros1 一样,可以参考:ros 加-g编译或debug编译
在这里插入图片描述
3、单独运行 ROS2 编译好的执行文件,不用ros2 run 去执行,发现缺少库依赖,这点和ros1的不一样,ros1的可以直接执行。
在这里插入图片描述
4、ps查看节点执行的时候,发现除了节点应用起来了,还有个 ros2 的应用,联想启动命令是 ros2 run mcu_controller mcu_controller。
在这里插入图片描述

5、怀疑 ros2 的节点起来和 ros1 的启动机制不一样,可能是在 ros2 的执行空间上启动节点内容,导致栈地址用 addr2line 无法解析。

暂时想不到好的方法验证,有知道的大神可以指点一下。

### 关于ROS2中C++回调函数使用ROS 2环境中,回调函数主要用于处理订阅的消息、服务请求和服务响应等事件。这些回调函数通常被定义为类成员函数,并通过节点对象注册到相应的通信接口上。 对于消息订阅而言,当新消息到达时会触发对应的回调函数[^1]。下面是一个简单的示例程序展示如何设置一个用于接收`std_msgs::msg::String`类型话题消息的回调: ```cpp #include "rclcpp/rclcpp.hpp" #include "std_msgs/msg/string.hpp" class MinimalSubscriber : public rclcpp::Node { public: MinimalSubscriber() : Node("minimal_subscriber") { subscription_ = this->create_subscription<std_msgs::msg::String>( "topic", 10, std::bind(&MinimalSubscriber::topic_callback, this, _1)); } private: void topic_callback(const std::shared_ptr<std_msgs::msg::String> msg) const { RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str()); } rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_; }; int main(int argc, char * argv[]) { rclcpp::init(argc, argv); auto node = std::make_shared<MinimalSubscriber>(); rclcpp::spin(node); rclcpp::shutdown(); } ``` 此代码片段展示了如何利用`std::bind()`将类成员函数绑定至回调位置[^3]。需要注意的是,在ROS 2里不再推荐直接使用像`ros::spin()`这样的全局循环机制;相反,应该采用基于生命周期管理器的方式启动并维持节点运行状态。 此外,为了实现更复杂的多线程场景下的安全访问共享资源操作,可以参考rosservice的例子来理解如何在线程间同步地传递数据[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值