# 模拟调试

由于模拟是在主机上运行的,因此可以使用所有桌面开发工具。

# 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:

  1. 在一个终端屏幕上输入开始模拟的命令:

    生产 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
    
  2. 打开另一个终端并键入

    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
    
  3. 然后在同一窗口中键入

    苏都 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