# 模拟调试
由于模拟是在主机上运行的,因此可以使用所有桌面开发工具。
# CLANG 地址消毒器(Mac OS、Linux)
Clang 地址消毒器可帮助查找对齐(总线)错误和其他内存故障,如分段故障。下面的命令设置了正确的编译选项。
生产 清洗 # 仅在正常构建后首次运行地址消毒器时才需要
PX4_ASAN=1 生产 px4_sitl jmavsim
# Valgrind
酿 安装 谷粒
或
苏都 apt-get 安装 谷粒
在 SITL 模拟期间使用 valgrind:
生产 px4_sitl_default jmavsim___valgrind
# 不使用调试器启动 Gazebo Classic SITL
默认情况下,在使用任何模拟器后端时,SITL 都是在未连接调试器的情况下启动的:
生产 px4_sitl_default gz
生产 px4_sitl_default gazebo-classic
生产 px4_sitl_default jmavsim
对于 Gazebo Classic(仅限),您也可以在连接调试器的情况下启动模拟器。但请注意,您必须在模拟器目标中提供载具类型,如下所示:
生产 px4_sitl_default gazebo-classic_iris_gdb
生产 px4_sitl_default gazebo-classic_iris_lldb
这将启动调试器,并通过 Gazebo 和 Iris 模拟器启动 SITL 应用程序。要进入调试器外壳并停止执行,点击 CTRL-C
:
过程 16529 停止 * 线程 #1: tid = 0x114e6d, 0x00007fff90f4430a libsystem_kernel.dylib`__read_nocancel + 10, name = 'px4', queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
画框 #0: 0x00007fff90f4430a libsystem_kernel.dylib`__read_nocancel + 10
libsystem_kernel.dylib`__read_nocancel: ->; 0x7fff90f4430a <;+10>;: jae 0x7fff90f44314 ; <;+20>;
0x7fff90f4430c <;+12>;: movq %rax, %rdi 0x7fff90f4430f <;+15>;: jmp 0x7fff90f3fc53 ; cerror_nocancel 0x7fff90f44314 <;+20>;:retq
(lldb)
为了不让驱动程序框架调度干扰调试会话 SIGCONT
应在 LLDB 和 GDB 中屏蔽:
(lldb) 进程句柄 SIGCONT -n 错误 -p 错误 -s 错误
或者以 GDB 为例:
(gdb) 处理 SIGCONT noprint nostop
之后,lldb 或 gdb shell 的行为与正常会话无异,请参阅 LLDB / GDB 文档。
最后一个参数,即查看器模型调试器三元组,实际上是传递给构建目录中的 make,因此
生产 px4_sitl_default gazebo-classic_iris_gdb
等同于
生产 px4_sitl_default # 使用 cmake 进行配置
生产 -C build/px4_sitl_default classic_iris_gdb
可以用以下命令获取构建目录中可用 make 目标的完整列表:
生产 帮助
# 为运行中的 SITL 附加 GDB
您还可以启动模拟,并 则 缚上 gdb
:
在一个终端屏幕上输入开始模拟的命令:
生产 px4_sitl_default gazebo-classic
脚本运行时,请注意 SITL 命令: 输出文本位于 "PX4" 大文本的右上方。它将列出 px4 二进制文件的位置,供以后使用。
SITL 命令: "<px4 bin file>"; "<build dir>";/etc ______ __ __ ___ | ___ \ \ \ / / / | | |_/ / \ V / / /| | | __/ / \ / /_| | | | / /^\ \ \___ | \_| \/ \/ |_/ px4 启动。信息 [px4] 启动脚本:/bin/sh etc/init.d-posix/rcS 0 信息 [启动] 发现模型自动启动 文件 作为 系统自动启动=10015
打开另一个终端并键入
ps -a
您需要注意名为 "PX4" 的进程的 PID;
(本例中为 14149)
atlas:~/px4/main/PX4-Autopilot$ ps -a PID TTY TIME CMD 1796 tty2 00:01:59 Xorg 1836 tty2 00:00:00 gnome-session-b 14027 pts/1 00:00:00 生产 14077 pts/1 00:00:00 吁 14078 pts/1 00:00:00 cmake 14079 分数/1 00:00:00 忍者 14090 pts/1 00:00:00 吁 14091 pts/1 00:00:00 敲击 14095 pts/1 00:01:23 gzserver 14149 PTS/1 00:02:48 PX4 14808 pts/2 00:00:00 ps
然后在同一窗口中键入
苏都 gdb [px4 垃圾桶 文件 路 (从步骤 1) 这里]
例如
苏都 gdb /home/atlas/px4/base/PX4-Autopilot/build/px4_sitl_default/bin/px4
现在,输入步骤 2 中的 PID 就可以连接到 PX4 实例。
缚上 [px4 上的 PID]
现在你应该有一个 GDB 接口来进行调试了。
# 编译器优化
可以抑制编译器对给定可执行文件和/或模块的优化(如 cmake 使用 添加可执行
或 add_library
)时,配置为 posix_sitl_*
.这在需要使用调试器逐步检查代码或打印变量时非常方便,否则这些变量将被优化掉。
为此,请设置环境变量 px4_no_optimization
是一个以分号分隔的正则表达式列表,该列表与需要在不进行优化的情况下编译的目标相匹配。当配置不是 posix_sitl_*
.
例如
出口 px4_no_optimization='px4;^modules__uORB;^modules__systemlib$'。
将抑制以下目标的优化:platforms__posix__px4_layer、modules__systemlib、modules__uORB、examples__px4_simple_app、modules__uORB__uORB_tests 和 px4。
可以使用该命令打印可以与这些正则表达式匹配的目标:
生产 -C build/posix_sitl_* list_cmake_targets