仿真调试
当模拟在主机上运行时,所有桌面开发工具都可用。
CLANG 地址消毒剂(Mac OS、Linux)
Clang 地址消毒剂有助于发现对齐(总线)错误以及其他内存故障,如段错误。下面的命令设置了正确的编译选项。
make clean # 仅需在常规编译后,第一次运行 address sanitizer 时使用
PX4_ASAN=1 make px4_sitl jmavsim
Valgrind
brew install valgrind
或者
sudo apt-get install valgrind
可以在连接或不连接调试器的情况下启动 SITL,并且可以使用 jMAVSim 或 Gazebo 作为仿真后端。这就产生了以下启动选项:
make px4_sitl_default # 通过 cmake 配置
make -C build/px4_sitl_default jmavsim___gdb
不使用调试器启动 Gazebo Classic SITL
默认情况下,使用任何仿真器后端启动 SITL 时都不会连接调试器:
make px4_sitl_default gz
make px4_sitl_default gazebo-classic
make px4_sitl_default jmavsim
仅对于 Gazebo Classic,你还可以连接调试器启动仿真器。不过要注意,必须在仿真器目标中指定飞行器类型,如下所示:
make px4_sitl_default gazebo-classic_iris_gdb
make px4_sitl_default gazebo-classic_iris_lldb
这将启动调试器,并使用 Gazebo 和 Iris 仿真器启动 SITL 应用程序。要进入调试器 shell 并暂停执行,请按 CTRL - C
:
Process 16529 stopped
* thread #1: tid = 0x114e6d, 0x00007fff90f4430a libsystem_kernel.dylib`__read_nocancel + 10, name = 'px4', queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
frame #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)
为了避免驱动框架调度干扰调试会话,应在 LLDB 和 GDB 中屏蔽 SIGCONT
:
(lldb) process handle SIGCONT -n false -p false -s false
或者在 GDB 下:
(gdb) handle SIGCONT noprint nostop
之后,lldb 或 gdb 脚本的行为类似于正常会话,请参阅 ldb/gdbb 文档。
最后一个参数,即 <viewer_model_debugger>
三元组,实际上会传递给构建目录中的 make 命令,因此
make px4_sitl_default gazebo-classic_iris_gdb
等价于
make px4_sitl_default # Configure with cmake
make -C build/px4_sitl_default classic_iris_gdb
可以使用以下命令获取构建目录中可用的 make 目标的完整列表:
make help
将 GDB 附加到正在运行的 SITL
你也可以先启动仿真,然后再附加 gdb
:
- 在一个终端窗口中输入启动仿真的命令:
make px4_sitl_default gazebo-classic
在脚本运行时,注意位于大 “PX4” 文本正上方的 SITL COMMAND: 输出文本。它会列出 px4 二进制文件的位置,供后续使用。
SITL COMMAND: "<px4 bin file>" "<build dir>"/etc
______ __ __ ___
| ___ \ \ \ / / / |
| |_/ / \ V / / /| |
| __/ / \ / /_| |
| | / /^\ \ \___ |
\_| \/ \/ |_/
px4 starting.
INFO [px4] startup script: /bin/sh etc/init.d-posix/rcS 0
INFO [init] found model autostart file as SYS_AUTOSTART=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 make
14077 pts/1 00:00:00 sh
14078 pts/1 00:00:00 cmake
14079 pts/1 00:00:00 ninja
14090 pts/1 00:00:00 sh
14091 pts/1 00:00:00 bash
14095 pts/1 00:01:23 gzserver
14149 pts/1 00:02:48 px4
14808 pts/2 00:00:00 ps
- 然后在同一个窗口中输入
sudo gdb [px4 bin file path (from step 1) here]
设置环境变量 PX4_NO_OPTIMIZATION
可以抑制以下目标的优化:platforms*_posix__px4_layer、modules__systemlib、modules__uORB、examples__px4_simple_app、modules__uORB__uORB_tests 和 px4。
sudo gdb /home/atlas/px4/base/PX4-Autopilot/build/px4_sitl_default/bin/px4
现在,你可以通过输入步骤 2 中记录的 PID 来附加到 PX4 实例。
attach [PID on px4]
现在你应该有一个用于调试的 GDB 界面。
编译器优化
在为 posix_sitl_*
进行配置时,可以抑制给定可执行文件和/或模块(通过 cmake 的 add_executable
或 add_library
添加)的编译器优化。当需要使用调试器逐行调试代码或打印那些否则会被优化掉的变量时,这会很有用。
要做到这一点,将环境变量 PX4_NO_OPTIMIZATION
设置为一个用分号分隔的正则表达式列表,这些正则表达式匹配那些需要在不进行优化的情况下编译的目标。当配置不是 posix_sitl_*
时,这个环境变量会被忽略。
以下设置会抑制以下目标的优化:platforms*_posix__px4_layer、modules__systemlib、modules__uORB、examples__px4_simple_app、modules__uORB__uORB_tests 和 px4。
export PX4_NO_OPTIMIZATION='px4;^modules__uORB;^modules__systemlib$'
可以使用以下命令打印可以用这些正则表达式匹配的目标:
make -C build/posix_sitl_* list_cmake_targets
总结
这段文档围绕 PX4 的仿真调试展开,介绍了多种调试工具和方法,包括使用 CLANG 地址消毒剂、Valgrind 进行调试,以及如何在不同场景下启动 SITL 并使用调试器(如 GDB、LLDB),还涉及了将 GDB 附加到正在运行的 SITL 进程和编译器优化的相关内容。如果你有特定的需求,如对文档进行润色、提取关键信息、根据内容进行拓展等,请随时告诉我。