apollo local 模式_Apollo开发者说丨使用GDB调试Apollo项目
更多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项目相关推荐
- apollo local 模式_Apollo 源码解析 —— 客户端配置 API(一)之一览
摘要: 原创出处 http://www.iocoder.cn/Apollo/client-config-api-1/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 本文,我们来一览 Apollo ...
- apollo local 模式_Java客户端使用指南 - 五、本地开发模式 - 《携程 Apollo v1.4 开发指南》 - 书栈网 · BookStack...
五.本地开发模式 Apollo客户端还支持本地开发模式,这个主要用于当开发环境无法连接Apollo服务器的时候,比如在邮轮.飞机上做相关功能开发. 在本地开发模式下,Apollo只会从本地文件读取配置 ...
- apollo local 模式_「架构」 - 配置中心 Apollo基本使用
公司需要使用Apollo配置中心,下面会出现大段Apollo官网文字截取引用. 一.Apollo(配置中心) Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境.不同 ...
- Spark的Local模式及案例
Spark的Local模式及案例 基本概念 Local模式搭建 1. 解压缩文件 2.修改文件名 启动 Local 环境 WordCount案例 1.添加文件 2.执行命令 3.结果截图 测试Spar ...
- 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 ...
- 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, ...
- 004 Spark中的local模式的配置以及测试
一:介绍 1.Spark的模式 Local:本地运行模式,主要用于开发.测试 Standalone:使用Spark自带的资源管理框架运行Spark程序,30%左右 Yarn: 将spark应用程序运行 ...
- Spring Cloud Data Flow初体验,以Local模式运行
1 前言 欢迎访问南瓜慢说 www.pkslow.com获取更多精彩文章! Spring Cloud Data Flow是什么,虽然已经出现一段时间了,但想必很多人不知道,因为在项目中很少有人用.不仅 ...
- apollo 配置中心_Apollo配置中心搭建笔记
如我所愿,十一小长假之前成功跳槽了. 由于准备还算充分,offer拿了不少,涨幅也普遍达到了预期. 但是在offer对比过程中我还是纠结了许久.在薪资差别不大的情况下,主要考虑的是平台规模.业务前景. ...
- java的Apollo的功能_Apollo配置中心
1什么是配置中心? 传统单体应用存在一些潜在缺陷,如随着规模的扩大,部署效率降低,团队协作效率差,系统可靠性变差,维护困难,新功能上线周期长等,所以迫切需要一种新的架构去解决这些问题,而微服务( mi ...
最新文章
- 什么是REST?以及RESTful的实现之二
- linux 常用查看网络连接方法及脚本
- day9-继承式多线程
- 大数据正在改变客户服务的五种方式
- js正则匹配闭合标签_正则匹配闭合HTML标签(支持嵌套)
- 下载丨7月数据库技术通讯:LINUX OS配置问题导致数据库重启
- 基于XMPP协议的Android即时通信系
- 防止HALCON刷新图像窗口控件闪烁
- 能够支持python开发的环境_Windows上使用virtualenv搭建Python+Flask开发环境
- mysql 性别以女生升序_MySql练习题
- 凤凰架构4——透明多级分流系统
- Android 静默安装
- 墨修尧哪一章痊愈_墨修尧叶璃
- python爬网易评论
- 去除百度搜索列表中广告的方法-电脑端
- 想要降低gradle版本时遇到“Minimum supported Gradle version is XXX. Current version is XXX.”
- JZOJ 5442 荒诞
- 弦民谣吉他音源 Orange Tree Samples Evolution Steel Strings Kontakt
- 蓝牙MESH网关_相对于米家多模网关,其实我更爱的是光照传感器
- Web Components 学习 01 认识 Web Components、一些组件库使用
热门文章
- html取json列表长度,js获取json元素数量的方法
- java实现用户分组,java实现分组算法,根据每组多少人来进行分组
- python自学月收入20k_每天自学2小时,18周便可月入20K,437集python自学资料拿走不谢...
- 403保护网站服务器,HTML5服务器禁止访问403错误动画
- 新浪微博模拟登陆+数据抓取(java实现)
- 标定_基于全景基础设施的多摄像机和3D激光雷达校准
- 点云质量评估_Chamfer Distance--倒角距离
- OpenCV_mechanisms of Canny operator(Canny算子检测图像边缘)
- 使用YOLO V4通过社交距离和口罩检测来缓解COVID
- 手撕代码之快速排序算法(简单明了)