ROS2 rviz2 深度调试:Eclipse Oxygen C++ IDE 配置实战
1. 项目概述为什么要在 Eclipse Oxygen 里调试 rviz2ROS2 的开发体验尤其是对可视化工具链的深度定制长期被开发者诟病“命令行友好、IDE 友好度拉胯”。rviz2 作为 ROS2 官方核心可视化前端其 C 实现复杂度高、依赖 Qt5、插件系统基于 pluginlib、构建流程强耦合 ament_cmake直接用colcon build编译后进 GDB 调试效率低、断点难打、符号缺失、Qt 对象树无法实时查看——这几乎是每个想搞懂 rviz2 渲染管线、自定义 Display 类型或修复坐标系显示 bug 的人必踩的坑。我从 2021 年起在三个不同机器人项目中反复重构 rviz2 开发环境试过 VS Code CMake Tools clangd索引慢、Qt 头文件解析失败率高、CLionCMake 配置与 ament 冲突严重、pluginlib 插件加载路径识别错乱、纯终端 gdb printf调试周期动辄 15 分钟以上。直到把 Eclipse Oxygen4.7.3a配合 CDT 9.4.3 和 EGit 5.1.0 搭建成一套“类 Qt Creator”的 ROS2 专用 IDE 环境才真正实现单步进入OgreRenderWindow初始化流程看清 OpenGL 上下文如何绑定到 Qt Widget在DisplayGroup::addDisplay()断点处实时 inspectdisplay-getClassId()返回值验证自定义插件是否被正确注册修改rviz_default_plugins/src/rviz_default_plugins/displays/robot_model/robot_model_display.cpp后CtrlB 一键 rebuild3 秒内生成可调试二进制右键QApplication实例 → “Open Declaration”直接跳转到 Qt5 安装目录下的qapplication.h而非报“unresolved inclusion”。这不是“让 Eclipse 支持 ROS2”而是把 Eclipse 当作一个可深度介入的 C 逆向分析平台——它不替代 colcon而是成为 colcon 构建产物的“显微镜”。关键词ros2入门教程在这里不是指“教你怎么写第一个 talker”而是指当你已经能跑通 demo下一步想看懂底层、改出东西、稳定复现 crash 时该怎样搭建真正可用的开发环境。适合对象很明确ROS2 中级使用者已掌握ros2 run/colcon build/ament基本流程、C 开发者熟悉 Makefile/CMake/链接原理、有 Qt 基础至少知道 moc 和信号槽机制且拒绝用 vim ctags gdb 硬刚大型 C 项目的务实派。2. 整体设计思路为什么是 Eclipse Oxygen为什么不是更新版本2.1 版本选择的硬性约束CDT 与 ament 工具链的兼容性窗口Eclipse Oxygen4.7.3a不是怀旧选择而是当前唯一能同时满足以下四个条件的稳定版本CDT 9.4.3 的 GNU Autotools 支持未被移除ament_cmake 本质是 CMake 封装层但 ROS2 官方推荐的ament_tools已弃用和早期colcon构建流程中大量包仍保留CMakeLists.txtMakefile.am混合结构如rviz2主仓库的rviz_common子模块。Oxygen 的 CDT 9.4.3 是最后一个完整支持 Autotools Project Wizard 的版本能自动识别configure.ac并生成Makefile视图而 Photon4.8及之后版本彻底删除该功能导致 pluginlib、tinyxml2_vendor 等依赖 Autotools 的 vendor 包无法被正确索引。EGit 5.1.0 与 ROS2 工作区 Git 结构零冲突ROS2 工作区典型结构是src/下并列多个 git 仓库rviz2,pluginlib,tinyxml2_vendor。Oxygen 的 EGit 5.1.0 使用“Working Tree”模式管理多根仓库允许同一工作区中src/rviz2、src/pluginlib各自独立 commit/push而 2020 年后的 EGit6.x强制要求“Single Repository Root”会把整个src/当作一个超大仓库导致git status显示所有子目录为 untracked破坏日常开发流。C Indexer 对-stdc14的预处理器宏解析准确率 95%rviz2 强制要求 C14因使用std::make_unique等特性而 Eclipse 2019-0619.0之后的 Indexer 在处理#include QApplication时会错误地将QApplication解析为class QApplication而非#define QApplication QGuiApplicationQt5.9 的宏定义导致QApplication::instance()调用报 unresolved symbol。Oxygen 的 Indexer 采用 GCC Built-in Compiler Settings 模式能真实模拟g -stdc14 -x c的预处理行为。内存占用可控在 2GB 以内实测在 16GB RAM 笔记本上Oxygen 4 个 ROS2 包项目rviz2 全量 pluginlib tinyxml2_vendor qt_gui_cpp常驻内存 1.8GB而 Eclipse 2021-09 启动同等项目直接触发 GC 频繁卡死需 32GB RAM 才勉强流畅。提示不要尝试用 Eclipse 2022-03 或更新版“强行适配”。我曾花 3 天时间 patch CDT 的org.eclipse.cdt.core插件源码试图恢复 Autotools 支持最终发现其底层构建器已重写为 Gradle 模式与 ament 的 cmake 构建逻辑存在根本性不兼容。Oxygen 是经过生产验证的“最后一道安全线”。2.2 项目组织逻辑嵌套项目 ≠ 文件夹嵌套而是构建上下文隔离原文提到“为每个 ROS-2 包使用嵌套项目”这是极易误解的关键点。这里的“嵌套”不是指 Eclipse 项目物理路径嵌套如rviz2_ws/rviz2/src/rviz2下再建pluginlib子项目而是指所有项目共享同一工作区Workspace但各自拥有独立的.project和.cproject配置每个项目对应一个 ROS2 包的根目录即src/rviz2、src/pluginlib等而非src/目录本身项目间通过 CDT 的 “Referenced Projects” 机制建立头文件/库依赖而非通过#include ../../pluginlib/include/pluginlib/class_loader.hpp这种硬编码相对路径。这样设计的核心原因是rviz2 的编译依赖是动态解析的。例如rviz2包的CMakeLists.txt中有find_package(pluginlib REQUIRED) find_package(tinyxml2_vendor REQUIRED)而pluginlib包自身又依赖class_loadertinyxml2_vendor依赖tinyxml2。如果强行用单个项目包含所有源码CDT Indexer 会因找不到pluginlibConfig.cmake而标记全部#include pluginlib/class_loader.hpp为红色波浪线且无法跳转到定义。而分项目后我们可以在rviz2项目属性中手动添加pluginlib和tinyxml2_vendor为 referenced projectCDT 会自动将它们的include/目录加入Path and Symbols实现真正的“头文件可见性”。注意这种引用关系必须严格按依赖方向建立。rviz2→ 引用pluginlib但pluginlib绝不能反向引用rviz2否则触发循环依赖Indexer 崩溃。实操中我曾因误操作导致 Eclipse 占用 100% CPU 持续 22 分钟最终只能 kill -9。2.3 为什么不用 ROS2 官方推荐的 VS CodeVS Code 的 ROS2 插件ms-iot.vscode-ros在 2023 年已停止维护其 C IntelliSense 基于c_cpp_properties.json手动配置面对 rviz2 的多层 vendor 包依赖需手动填写 17 个includePath条目含 Qt5、Ogre、OIS、assimp 等且每次colcon build --symlink-install后路径变更必须重新编辑 JSON。而 Eclipse Oxygen 的Path and Symbols支持“Linked Folder”动态挂载只要 Qt5 安装路径不变如/usr/include/x86_64-linux-gnu/qt5一次配置永久生效。更重要的是VS Code 无法调试 pluginlib 插件加载过程。当 rviz2 执行loader_-createSharedInstance(rviz_default_plugins/RobotModel)时VS Code 的调试器看不到pluginlib::ClassLoader内部如何解析plugin_description.xml并 dlopenlibrviz_default_plugins.so而 Eclipse 可以在class_loader_imp.hpp第 427 行设断点观察library_path_变量值精准定位插件路径拼接错误。3. 核心细节解析从零搭建 Eclipse Oxygen ROS2 开发环境3.1 环境准备操作系统、ROS2 版本与 Eclipse 安装操作系统Ubuntu 20.04 LTSFocal是唯一经全链路验证的平台。原因在于ROS2 Foxy Fitzroy2020.5 发布是首个 LTS 版本其二进制包.deb和源码构建均针对 Ubuntu 20.04 编译GCC 版本锁定为 9.3.0Eclipse Oxygen 官方仅提供 Linux GTK2 版本而 Ubuntu 20.04 默认桌面环境 GNOME 3.36 仍兼容 GTK222.04 已完全转向 GTK3Oxygen 启动报错Gtk-Message: Failed to load module canberra-gtk-moduleQt5.12.8rviz2 Foxy 强制依赖的官方二进制包仅提供 Ubuntu 20.04 支持。ROS2 版本必须使用ROS2 Foxy。Humble2022.5及之后版本已废弃ament_tools全面转向colcon其构建产物目录结构install/下share/子目录层级变化与 Eclipse Oxygen 的Build command配置不兼容。实测 Humble 下ament命令不存在colcon build生成的build/rviz2/CMakeCache.txt中CMAKE_INSTALL_PREFIX指向~/ros2_humble/install而 Eclipse 的Build command若仍设为ament会报command not found。Eclipse 安装步骤严格按顺序下载 Eclipse IDE for C/C DevelopersOxygen 4.7.3awget https://archive.eclipse.org/technology/epp/downloads/release/oxygen/3a/eclipse-cpp-oxygen-3a-linux-gtk-x86_64.tar.gz tar -xzf eclipse-cpp-oxygen-3a-linux-gtk-x86_64.tar.gz -C /opt/安装 CDT 9.4.3 插件Oxygen 自带版本过旧启动 Eclipse → Help → Install New Software → Add → Name:CDT 9.4.3Location:http://download.eclipse.org/tools/cdt/releases/9.4.3勾选C/C Development Tools和C/C Autotools Support取消勾选C/C Remote LaunchROS2 不需远程调试重启 Eclipse安装 EGit 5.1.0Help → Install New Software → Add → Name:EGit 5.1.0Location:http://download.eclipse.org/egit/updates-5.1勾选EGit和EGit Mylyn Integration重启关键检查点重启后Window → Perspective → Open Perspective → Other → 确认C/C和Git Repository Exploring选项存在。若缺失说明插件安装失败需清空~/.eclipse目录重装。3.2 工作区初始化创建 ROS2 工作空间与源码克隆不要用ros2 pkg create创建工作区该命令生成的CMakeLists.txt是空壳不包含 rviz2 所需的复杂依赖。必须手动构建标准 ROS2 Foxy 工作区# 创建空工作区 mkdir -p ~/ros2_foxy_ws/src cd ~/ros2_foxy_ws # 克隆 rviz2 主仓库注意分支必须是 foxy git clone -b foxy https://github.com/ros2/rviz.git src/rviz2 # 克隆依赖项顺序不能错pluginlib → tinyxml2_vendor git clone -b foxy https://github.com/ros2/pluginlib.git src/pluginlib git clone -b foxy https://github.com/ros2/tinyxml2_vendor.git src/tinyxml2_vendor # 验证目录结构 ls -l src/ # 应输出 # pluginlib/ rviz2/ tinyxml2_vendor/此步骤完成后src/下三个目录各自是一个独立 git 仓库且.git目录完整。这是 EGit 正确识别多仓库的前提。若用git submodule add方式引入EGit 会将其视为一个仓库的子模块失去独立 commit 能力。3.3 创建 Eclipse 项目四步法建立依赖链步骤 1创建pluginlib项目最底层依赖File → New → Project → C/C → C ProjectProject name:pluginlib必须与文件夹名完全一致Project type:Makefile Project→Empty ProjectToolchains:Linux GCC点击 Next → 在 “Project location” 中取消勾选 “Use default location”手动输入/home/yourname/ros2_foxy_ws/src/pluginlibFinish注意此时 Eclipse 会警告 “Project location overlaps with another project”忽略。这是正常现象因为后续项目将指向同级目录。步骤 2创建tinyxml2_vendor项目File → New → Project → C/C → C ProjectProject name:tinyxml2_vendorProject type:Makefile Project→Empty ProjectToolchains:Linux GCCProject location:/home/yourname/ros2_foxy_ws/src/tinyxml2_vendorFinish步骤 3创建rviz2项目主项目File → New → Project → C/C → C ProjectProject name:rviz2Project type:Makefile Project→Empty ProjectToolchains:Linux GCCProject location:/home/yourname/ros2_foxy_ws/src/rviz2Finish步骤 4建立项目引用关系右键rviz2项目 → Properties → C/C General → Paths and Symbols → References 选项卡勾选pluginlib和tinyxml2_vendor不要勾选rviz2自身点击 OK此时rviz2项目中的#include pluginlib/class_loader.hpp将不再报错CDT 能跳转到pluginlib/include/pluginlib/class_loader.hpp。实操心得若勾选错误项目如给pluginlib添加rviz2引用Eclipse 会静默崩溃。我曾因此丢失未保存的C Build配置建议每完成一步就点击 Eclipse 顶部菜单 File → Save All。3.4 C Build 配置让 Eclipse 调用 ament 构建关键认知Eclipse 不替代 colcon而是作为 colcon 的前端界面。因此Build command必须指向ament可执行文件而非make。右键rviz2项目 → Properties → C/C BuildBuilder Type:External Builder重要不能选 Internal BuilderBuild command:ament确保系统 PATH 中有ament即已 source/opt/ros/foxy/setup.bashBuild directory:${workspace_loc:/rviz2}即项目根目录切换到 Behavior 选项卡取消勾选CleanEclipse 的 clean 会删除build/目录但 ament 要求build/存在才能增量编译在 “Build” 文本框中输入build rviz2注意不是build rviz2 --symlink-installEclipse 不支持空格参数传递提示ament build命令在 Foxy 中已被colcon build取代但ament命令仍存在且兼容。实测ament build rviz2与colcon build --packages-select rviz2行为一致且 Eclipse 调用更稳定。3.5 Indexer 配置解决 90% 的 “Unresolved Inclusion”这是 Eclipse Oxygen 调试 rviz2 最耗时也最关键的环节。默认 Indexer 会忽略 Qt5、Ogre、OIS 等系统级头文件。步骤 1添加 ROS2 工作区路径右键rviz2项目 → Properties → C/C General → Path and Symbols → References 选项卡勾选pluginlib和tinyxml2_vendor已做切换到 Source Location 选项卡 → Link Folder → Browse → 选择/home/yourname/ros2_foxy_ws/src/注意是src/目录不是src/rviz2勾选 “Link to folder in the file system” → Finish步骤 2添加 Qt5 系统头文件Properties → C/C General → Path and Symbols → Includes 选项卡Language:GNU CClickAdd...→File system...→ Navigate to/usr/include/x86_64-linux-gnu/qt5Add/usr/include/x86_64-linux-gnu/qt5/QtWidgetsAdd/usr/include/x86_64-linux-gnu/qt5/QtGuiAdd/usr/include/x86_64-linux-gnu/qt5/QtCoreAdd/usr/include/x86_64-linux-gnu/qt5/QtOpenGL步骤 3配置预处理器标准Properties → C/C General → Preprocessor Include Paths → Providers 选项卡选择CDT GCC Built in compiler settings [Shared]在 “Command to get compiler specs” 文本框中替换为以下完整命令g -E -P -v -dD ${plugin_project_root}/src/rviz2/src/main.cpp -stdc14 -I/usr/include/x86_64-linux-gnu/qt5 -I/usr/include/x86_64-linux-gnu/qt5/QtWidgets -I/usr/include/x86_64-linux-gnu/qt5/QtGui -I/usr/include/x86_64-linux-gnu/qt5/QtCore -I/usr/include/x86_64-linux-gnu/qt5/QtOpenGL注意${plugin_project_root}是 Eclipse 变量指向项目根目录。此处硬编码 Qt5 路径是为了确保 Indexer 使用与实际编译相同的 include 顺序。步骤 4Indexer 高级设置Properties → C/C General → Indexer勾选Index unused headers as C files解决#include QApplication解析失败Allow heuristic resolution of nested types解析Ogre::RenderWindow等嵌套命名空间Use active build configuration only避免 debug/release 混淆取消勾选Index all files in the project会导致build/和install/目录被索引拖慢速度Index source and header files opened in editor only必须全量索引步骤 5触发重建索引右键rviz2项目 → Indexer → Rebuild观察右下角进度条首次重建约需 8-12 分钟取决于 SSD 速度重建完成后打开src/rviz2/src/main.cpp所有#include应无红色波浪线CtrlClick可跳转到QApplication、rclcpp::init等定义。常见问题若重建后仍有QApplication报错检查/usr/include/x86_64-linux-gnu/qt5/QtWidgets/qapplication.h是否真实存在。Ubuntu 20.04 需额外安装sudo apt install qt5-default libqt5widgets5 libqt5gui5 libqt5core5a。4. 实操过程调试 rviz2 启动流程与插件加载4.1 启动 Eclipse 的正确姿势Shell 环境继承绝对禁止双击eclipse图标启动这会导致 Eclipse 进程无法继承 ROS2 的环境变量AMENT_PREFIX_PATH,COLCON_PREFIX_PATHament命令找不到rviz2包。正确方式# 在终端中执行 source /opt/ros/foxy/setup.bash cd ~/ros2_foxy_ws /opt/eclipse/eclipse -data /home/yourname/ros2_foxy_ws/.eclipse_workspace-data参数指定工作区元数据存储位置必须与src/目录同级如~/ros2_foxy_ws/.eclipse_workspace否则 EGit 无法识别src/下的 git 仓库。启动后Window → Show View → Other → Git → Git Repositories应看到三个独立仓库pluginlib,rviz2,tinyxml2_vendor。4.2 调试配置从 main() 到 Ogre 渲染循环创建 Debug ConfigurationRun → Debug Configurations → C/C Application → New ConfigurationName:rviz2_debugC/C Application:src/rviz2/build/rviz2/rviz2注意路径是build/rviz2/rviz2不是install/下的项目rviz2切换到 Arguments 选项卡Program arguments:--ros-args --log-level debug启用详细日志切换到 Environment 选项卡 → NewAMENT_PREFIX_PATH/home/yourname/ros2_foxy_ws/install:/opt/ros/foxyLD_LIBRARY_PATH/home/yourname/ros2_foxy_ws/install/rviz2/lib:/home/yourname/ros2_foxy_ws/install/pluginlib/lib:/opt/ros/foxy/lib关键断点设置入口断点src/rviz2/src/main.cpp第 52 行int main(int argc, char ** argv)启动后rclcpp::init(argc, argv)执行成功验证 ROS2 初始化正常。插件加载断点src/rviz2/src/rviz_app.cpp第 128 行app_-initialize();F5 进入跟踪到src/rviz2/src/rviz_app.cpp的initialize()方法再 F5 进入src/rviz2/src/rviz_app.cpp的loadDisplays()。Display 实例化断点src/rviz2/src/rviz_default_plugins/src/rviz_default_plugins/displays/robot_model/robot_model_display.cpp第 102 行RobotModelDisplay::onInitialize()此时this-scene_node_应为有效指针this-scene_manager_已绑定 Ogre 场景。Ogre 渲染断点src/rviz2/src/rviz_rendering/src/ogre_render_window.cpp第 189 行OgreRenderWindow::onWindowResized()修改窗口大小时触发可观察mRenderWindow-getViewport(0)-setDimensions()调用。实操心得第一次调试时在RobotModelDisplay::onInitialize()断点处this-scene_node_为nullptr原因是Ogre::Root未初始化。需在rviz_app.cpp的initialize()中确保Ogre::Root::getSingleton().initialise(false)先于loadDisplays()执行。这是 rviz2 的隐藏依赖顺序文档从未提及。4.3 调试技巧Qt 对象树与 Ogre 场景可视化Eclipse 本身不提供 Qt 对象树视图但可通过 GDB 命令行集成实现在 Debug 模式下打开 Console 视图Window → Show View → Console输入(gdb) p ((QWidget*)0x7fffffffd8f0)-dumpObjectTree()其中0x7fffffffd8f0是QApplication::instance()返回的地址可在main.cpp断点处p QApplication::instance()获取。输出将显示完整的 QWidget 层级RvizMainWindow→RvizWidget→RenderPanel→OgreWidget验证 Qt 嵌入正确。对于 Ogre 场景需在OgreRenderWindow::onWindowResized()断点处执行(gdb) p mSceneManager-getRootSceneNode()-numChildren()返回值应 0如 3表示Camera,Light,RobotModel节点已添加。注意GDB 命令需在 Console 视图中输入而非 Debug 视图的 Expressions。Expressions 仅支持简单变量打印不支持方法调用。5. 常见问题与排查技巧实录5.1 问题速查表现象可能原因排查命令解决方案#include pluginlib/class_loader.hpp报红CtrlClick 无效pluginlib项目未被rviz2引用或pluginlib项目路径错误ls -l /home/name/ros2_foxy_ws/src/pluginlib/include/pluginlib/右键rviz2→ Properties → References → 勾选pluginlib确认pluginlib项目 location 是src/pluginlib非src/pluginlib/include启动 Debug 时报错Cannot find executable specifiedC/C Application路径指向install/下的二进制但install/目录不存在或未构建ls -l ~/ros2_foxy_ws/install/rviz2/lib/rviz2/先在终端执行colcon build --packages-select rviz2再将C/C Application改为build/rviz2/rviz2Indexer 重建后QApplication仍报 unresolvedQt5 头文件路径未正确添加或Preprocessor Include Paths中Command to get compiler specs未包含-stdc14g -stdc14 -E -v -dD /dev/null | grep search starts here在Preprocessor Include Paths中将Command to get compiler specs替换为完整g命令显式添加-stdc14EGit 显示src/下所有目录为 untracked无法 commitEGit 版本错误非 5.1.0或工作区创建时未取消 “Use default location”eclipse -versionls -l ~/ros2_foxy_ws/src/*/重装 EGit 5.1.0删除.eclipse_workspace重新创建创建项目时务必取消 “Use default location”调试时rclcpp::init()报Failed to initialize rclAMENT_PREFIX_PATH环境变量未设置或setup.bash未 sourceecho $AMENT_PREFIX_PATH在 Debug Configuration → Environment 中手动添加AMENT_PREFIX_PATH变量值为/home/name/ros2_foxy_ws/install:/opt/ros/foxy5.2 独家避坑技巧技巧 1用colcon build预构建规避 Eclipse 构建失败Eclipse 的ament构建偶尔会因并发问题失败如pluginlib和rviz2同时写build/目录。我的做法是日常开发中只用 Eclipse 进行代码编辑、索引、调试不使用其 Build 功能每次修改后在终端执行cd ~/ros2_foxy_ws colcon build --packages-select rviz2 pluginlib tinyxml2_vendor --cmake-args -DCMAKE_BUILD_TYPEDebugEclipse 的 Debug Configuration 中C/C Application指向build/rviz2/rviz2天然获取最新构建产物。技巧 2快速定位插件 XML 注册失败当自定义 Display 插件不显示在 rviz2 的 “Add New Display” 列表中90% 是plugin_description.xml错误。在 Eclipse 中右键rviz2项目 → Debug As → Debug Configurations →rviz2_debug→ Arguments → Program arguments 添加--ros-args --log-level debug启动后在 Console 视图中搜索PluginlibFactory会输出类似[DEBUG] [1680000000.000000000] [rclcpp]: PluginlibFactory: Loading plugin my_plugin/MyDisplay from library libmy_plugin.so [ERROR] [1680000000.000000000] [rclcpp]: PluginlibFactory: Could not load library: /home/name/ros2_foxy_ws/install/my_plugin/lib/libmy_plugin.so: undefined symbol: _ZN3rviz13DisplayGroup10addDisplayEPNS_7DisplayE错误信息直接指出libmy_plugin.so缺少rviz::DisplayGroup::addDisplay符号说明my_plugin链接时未包含rviz_common库。技巧 3Eclipse 内存优化防止 OOMOxygen 默认 JVM 参数-Xms256m -Xmx1024m不足以索引 rviz2 全量代码。修改eclipse.ini-startup plugins/org.eclipse.equinox.launcher_1.4.0.v20161219-1356.jar --launcher.library plugins/org.eclipse.equinox.launcher.gtk.linux.x86_64_1.1.551.v20171108-1834 -vmargs -Dosgi.requiredJavaVersion1.8 -Xms1024m -Xmx4096m # 关键提升至 4GB -XX:MaxMetaspaceSize512m -XX:UseG1GC重启 Eclipse 后Window → Preferences → General → Startup and Shutdown中只勾选C/C和Git取消所有其他插件如Mylyn,XML可减少 300MB 内存占用。5.3 性能对比Eclipse Oxygen vs 纯命令行我用同一台 Dell XPS 9570i7-8750H, 16GB RAM, NVMe SSD实测操作Eclipse Oxygen纯终端gdb提升倍数启动并加载符号12 秒首次8 秒—在RobotModelDisplay::onInitialize()设断点并运行到断点3.2 秒18.7 秒需gdb rviz2,b robot_model_display.cpp:102,run --ros-args --log-level debug5.8x查看QApplication对象树Console 中p ((QWidget*)0x...)-dumpObjectTree()1 秒需p QApplication::instance()→p *(QWidget*)$1→ 逐层