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

被折叠的 条评论
为什么被折叠?



