更多Apollo智能驾驶相关讯息,尽在#Apollo开发者社区#!

社区公众号曾经推送过一篇《技术文档丨使用VSCode构建、调试Apollo项目 》,基本能满足Apollo项目的调试需求,但直接在终端中使用GDB调试Apollo项目,灵活性更强。本文简介借助GDB调试Apollo项目的基本方法,希望给大家学习Apollo带来一定的帮助。

下面是由社区荣誉布道师——贺志国提供的文章,对使用GDB调试Apollo项目进行详细讲解,希望这篇文章能给感兴趣的开发者带来更多帮助。

以下,ENJOY

使用GDB调试Apollo项目必须带有调试符号信息,因此编译Apollo项目时,不能使用opt选项,可根据实际需求使用如下两个编译命令中任意一个进行构建:

以Planning模块为例说明。完成第2步编译后,会在/apollo/bazel-bin/modules/planning目录中生成可执行文件Planning。

首先启动Apollo后台核心进程和Dreamview:

bash scripts/bootstrap.sh

在Dreamview中开启与Planning模块相关的其他模块进程,这个需要根据实际情况确定,无法给出统一的操作方法。

接下来,可以使用如下几种方法启动Planning模块的调试:

1# 启动方法1:直接使用GDB启动planning模块,注意后面的flagfile需根据需要指定,2# 如果是Navigation模式,则有--flagfile=/apollo/modules/planning/conf/planning_navi.conf3# 注意:--args及后面的--flagfile也可以先不设置,而在进入GDB调试界面后,使用set args4# 命令进行设置,下同。5gdb -q --args bazel-bin/modules/planning/planning --flagfile=/apollo/modules/planning/conf/planning.conf67# 启动方法2:借助Apollo提供的脚本程序,注意后面的flagfile需根据需要指定,8# 如果是Navigation模式,则有--flagfile=/apollo/modules/planning/conf/planning_navi.conf9bash scripts/planning.sh start_gdb --flagfile=/apollo/modules/planning/conf/planning.conf1011# 启动方法3:在Dreamview中启动Planning模块,然后使用ps aux | grep planning命令查找12# planning进程ID(PID),假设为35872,则使用attach模式附加到当前planning进程调试13sudo gdb -q bazel-bin/modules/planning/planning -p 35872

注意:如果需要调试各模块内部包含的一些小工具程序,则只能使用如下方法启动调试(以modules/planning/reference_line/smoother_util.cc为例进行说明):

1# 注意:--args及后面的一串参数也可以先不设置,而在进入GDB调试界面后,使用set args2# 命令进行设置。3gdb -q --args bazel-bin/modules/planning/reference_line/smoother_util --input_file /apollo/data/bag/record_data.txt --smooth_length 200

Apollo 3.5以上版本(基于Cyber RT框架)的调试启动命令:

Apollo 3.5以上版本使用Cyber RT进行任务调度与通信,调试功能模块的命令更新为(进入GDB后的操作方法相同):

1gdb -q --args /apollo/bazel-bin/cyber/mainboard -d /apollo/modules/planning/dag/planning.dag2sudo gdb -q /apollo/bazel-bin/cyber/mainboard -p 35872

进入GDB调试界面后,可以使用如下常见命令调试:

注意:因为Apollo项目文件很多,不要过多使用TAB键进行提示,否则可能会出现响应异常缓慢的现象。

关于打印STL库元素方面更多的内容,可以参考这篇文章:《打印STL容器中的内容》:kancloud.cn/wizardforcel/gdb-tips-100/146748

下图给出了一个显示STL容器调试的一个示例:

26$21 = 27(gdb) where28#0 0x00007f66aab24278 in apollo::planning::scenario::lane_follow::LaneFollowStage::PlanOnReferenceLine (this=0x22baa70, planning_start_point=..., frame=0x7f66c00470f0, reference_line_info=0x7f66c004f9e0)29 at modules/planning/scenarios/lane_follow/lane_follow_stage.cc:16330#1 0x00007f66aab23ad4 in apollo::planning::scenario::lane_follow::LaneFollowStage::Process (this=0x22baa70, planning_start_point=..., frame=0x7f66c00470f0) at modules/planning/scenarios/lane_follow/lane_follow_stage.cc:12531#2 0x00007f66a99ba732 in apollo::planning::scenario::Scenario::Process (this=0x22ba5d0, planning_init_point=..., frame=0x7f66c00470f0) at modules/planning/scenarios/scenario.cc:7632#3 0x00007f66ab5f553a in apollo::planning::PublicRoadPlanner::Plan (this=0x2273e30, planning_start_point=..., frame=0x7f66c00470f0, ptr_computed_trajectory=0x7f66247fedf0) at modules/planning/planner/public_road/public_road_planner.cc:5133#4 0x00007f66d0239130 in apollo::planning::NaviPlanning::Plan (this=0x223c1f0, current_time_stamp=1557975960.7090025, stitching_trajectory=std::vector of length 1, capacity 1 = {...}, trajectory_pb=0x7f66247fedf0) at modules/planning/navi_planning.cc:48634#5 0x00007f66d0236cf5 in apollo::planning::NaviPlanning::RunOnce (this=0x223c1f0, local_view=..., trajectory_pb=0x7f66247fedf0) at modules/planning/navi_planning.cc:26835#6 0x00007f66b230c494 in apollo::planning::PlanningComponent::Proc (this=0x1bca110, prediction_obstacles=std::shared_ptr (count 4, weak 0) 0x7f661c076338, chassis=std::shared_ptr (count 7, weak 0) 0x7f661c0663f8,36 localization_estimate=std::shared_ptr (count 7, weak 0) 0x7f661c05e688) at modules/planning/planning_component.cc:13437#7 0x00007f66b23b36c4 in apollo::cyber::Component<:prediction::predictionobstacles apollo::cyber::nulltype="">::Process (this=0x1bca110,38 msg0=std::shared_ptr (count 4, weak 0) 0x7f661c076338, msg1=std::shared_ptr (count 7, weak 0) 0x7f661c0663f8, msg2=std::shared_ptr (count 7, weak 0) 0x7f661c05e688) at ./cyber/component/component.h:29139#8 0x00007f66b23a1698 in apollo::cyber::Component<:prediction::predictionobstacles apollo::cyber::nulltype="">::Initialize(apollo::cyber::proto::ComponentConfig const&)::{lambda(std::shared_ptr<:prediction::predictionobstacles> const&, std::shared_ptr

实际使用时,可以将VSCode和GDB结合起来使用。一般使用VSCode上方的文本编辑器显示源代码文件,在VSCode下方的终端窗口进行GDB调试,如下图所示:

在进入GDB界面后,使用b命令设置相关断点,使用r命令启动待调试进程,待运行至断点处后,再根据具体需要合理使用n、s、c、p、bt等命令进行单步调试。

注意:如果使用attach模式附加到已有进程PID调试,则不能使用r命令启动进程,而必须使用c命令继续执行当前进程。否则,GDB永远不会跳转至你所设置的断点处。

调试过程中,如果想执行某条Shell命令(例如查找某个文件是否存在),可不必退出GDB界面而直接操作,具体方法如下:

有时可能需要将调试信息输出到日志文件,操作方法如下:

进行GDB调试界面后,使用如下命令进行日志输出设置:

考虑到某些特殊情形,可能需要暂时退出当前调试,待下次重启调试时又希望自动加载当前所有断点,GDB完全支持该需求,操作方法如下:

保存断点到指定文件

从指定文件加载断点

在调试过程中,不可避免地需要重新编译代码,这时不必退出GDB,只需在外部重新编译代码后(也可参考5.3 在GDB中执行Shell命令的方法直接在GDB内部重新编译),在GDB内部使用指令r重新运程程序,GDB会自动更新程序状态。下面以一个小实例进行具体说明:

示例很简单,就是将modules/planning/planning.cc中的Status Planning::Start()函数注释一行代码AINFO << "Planning started";,如下所示:

以下是修改之前的modules/planning/planning.cc文件中的Status Planning::Start()函数:

顺利编译Apollo项目后,在Docker内部使用指令gdb -q --args bazel-bin/modules/planning/planning--flagfile=/apollo/modules/planning/conf/

planning.conf启动Planning模块调试,使用指令b modules/planning/planning.cc:206设置断点,使用指令r运行Planning模块:

GDB会在断点planning.cc:206处暂停,使用指令n执行单步调试,可观察到语句AINFO << "Planning started";未被注释:

接下来,在VSCode中将语句AINFO << "Planning started";注释:

在GDB调试界面中,使用指令!bash apollo.sh build -j 8重新编译Apollo项目:

编译成功后,使用指令r并回答y重新运行Planning模块:

GDB同样在断点planning.cc:206处暂停,使用指令l显示断点附件处的代码,可观察到语句AINFO << "Planning started";已被注释,代码修改生效:

注意:如果使用attach模式附加到已有进程PID调试Planning模块,该方法不会生效。

以上是"使用GDB调试Apollo项目"的全部内容,更多话题讨论、技术交流可以私信【Apollo开发者社区】百家号,发送【交流群】,进开发者交流社群。

* 以上内容为开发者原创,不代表百度官方言论。

内容来自开发者CSDN。

apollo local 模式_Apollo开发者说丨使用GDB调试Apollo项目相关推荐

  1. apollo local 模式_Apollo 源码解析 —— 客户端配置 API(一)之一览

    摘要: 原创出处 http://www.iocoder.cn/Apollo/client-config-api-1/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 本文,我们来一览 Apollo ...

  2. apollo local 模式_Java客户端使用指南 - 五、本地开发模式 - 《携程 Apollo v1.4 开发指南》 - 书栈网 · BookStack...

    五.本地开发模式 Apollo客户端还支持本地开发模式,这个主要用于当开发环境无法连接Apollo服务器的时候,比如在邮轮.飞机上做相关功能开发. 在本地开发模式下,Apollo只会从本地文件读取配置 ...

  3. apollo local 模式_「架构」 - 配置中心 Apollo基本使用

    公司需要使用Apollo配置中心,下面会出现大段Apollo官网文字截取引用. 一.Apollo(配置中心) Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同 ...

  4. Spark的Local模式及案例

    Spark的Local模式及案例 基本概念 Local模式搭建 1. 解压缩文件 2.修改文件名 启动 Local 环境 WordCount案例 1.添加文件 2.执行命令 3.结果截图 测试Spar ...

  5. spark-2.4.5-bin-2.6.0-cdh5.15.1环境搭建:Local模式和StandAlone

    下载源码进行编译 在这一篇中,介绍了如何下载源码进行编译,编译好的文件名为spark-2.4.5-bin-2.6.0-cdh5.15.1 对文件进行解压:tar -xvf spark-2.4.5-bi ...

  6. spark-1.6.0-cdh5.15.1环境搭建:Local模式和StandAlone

    下载spark 从http://archive.cloudera.com/cdh5/cdh/5/下载spark-1.6.0-cdh5.15.1,因为我之前使用的hadoop版本都是cdh5.15.1, ...

  7. 004 Spark中的local模式的配置以及测试

    一:介绍 1.Spark的模式 Local:本地运行模式,主要用于开发.测试 Standalone:使用Spark自带的资源管理框架运行Spark程序,30%左右 Yarn: 将spark应用程序运行 ...

  8. Spring Cloud Data Flow初体验,以Local模式运行

    1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring Cloud Data Flow是什么,虽然已经出现一段时间了,但想必很多人不知道,因为在项目中很少有人用.不仅 ...

  9. apollo 配置中心_Apollo配置中心搭建笔记

    如我所愿,十一小长假之前成功跳槽了. 由于准备还算充分,offer拿了不少,涨幅也普遍达到了预期. 但是在offer对比过程中我还是纠结了许久.在薪资差别不大的情况下,主要考虑的是平台规模.业务前景. ...

  10. java的Apollo的功能_Apollo配置中心

    1什么是配置中心? 传统单体应用存在一些潜在缺陷,如随着规模的扩大,部署效率降低,团队协作效率差,系统可靠性变差,维护困难,新功能上线周期长等,所以迫切需要一种新的架构去解决这些问题,而微服务( mi ...

最新文章

  1. 什么是REST?以及RESTful的实现之二
  2. linux 常用查看网络连接方法及脚本
  3. day9-继承式多线程
  4. 大数据正在改变客户服务的五种方式
  5. js正则匹配闭合标签_正则匹配闭合HTML标签(支持嵌套)
  6. 下载丨7月数据库技术通讯:LINUX OS配置问题导致数据库重启
  7. 基于XMPP协议的Android即时通信系
  8. 防止HALCON刷新图像窗口控件闪烁
  9. 能够支持python开发的环境_Windows上使用virtualenv搭建Python+Flask开发环境
  10. mysql 性别以女生升序_MySql练习题
  11. 凤凰架构4——透明多级分流系统
  12. Android 静默安装
  13. 墨修尧哪一章痊愈_墨修尧叶璃
  14. python爬网易评论
  15. 去除百度搜索列表中广告的方法-电脑端
  16. 想要降低gradle版本时遇到“Minimum supported Gradle version is XXX. Current version is XXX.”
  17. JZOJ 5442 荒诞
  18. 弦民谣吉他音源 Orange Tree Samples Evolution Steel Strings Kontakt
  19. 蓝牙MESH网关_相对于米家多模网关,其实我更爱的是光照传感器
  20. Web Components 学习 01 认识 Web Components、一些组件库使用

热门文章

  1. html取json列表长度,js获取json元素数量的方法
  2. java实现用户分组,java实现分组算法,根据每组多少人来进行分组
  3. python自学月收入20k_每天自学2小时,18周便可月入20K,437集python自学资料拿走不谢...
  4. 403保护网站服务器,HTML5服务器禁止访问403错误动画
  5. 新浪微博模拟登陆+数据抓取(java实现)
  6. 标定_基于全景基础设施的多摄像机和3D激光雷达校准
  7. 点云质量评估_Chamfer Distance--倒角距离
  8. OpenCV_mechanisms of Canny operator(Canny算子检测图像边缘)
  9. 使用YOLO V4通过社交距离和口罩检测来缓解COVID
  10. 手撕代码之快速排序算法(简单明了)