跳至内容

模拟调试

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

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 古董
生产 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 false -p false -s false

或者以 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 古董

    脚本运行时,请注意 SITL 命令: 输出文本位于 "PX4" 大文本的右上方。它将列出 px4 二进制文件的位置,供以后使用。

    SITL 命令: "<px4 bin file>"; "<构建目录>"/etc
    
    ______  __   __    ___
    | ___ \ \ \ / /   /   |
    | |_/ /  \ V /   / /| |
    |  __/   /   \  / /_| |
    | |     / /^\ \ \___  |
    \_|     \/   \/     |_/
    
    px4 开始
    
    信息  [px4] 启动脚本:/bin/sh etc/init.d-posix/rcS 0
    信息  [init]发现模型自动启动文件为 SYS_AUTOSTART=10015
  2. 打开另一个终端并键入

    ps -a

    您需要注意名为 "PX4" 的进程的 PID;

    (本例中为 14149)

    atlas:~/px4/main/PX4-Autopilot$ ps -a
        PID TTY          时间 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 pts/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]

    现在你应该有一个 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_* 列出制作目标