Linux系统中程序异常终止或崩溃会发生核心转储(Core Dump)。简单地说,ROS进程崩溃可以生成core文件,再利用gdb调试该core文件就可以获取ROS进程崩溃的详细信息。
1. 生成core文件
1.1 取消core文件生成大小限制
在/etc/security/limits.conf
文件中添加如下代码:
* soft core unlimited
* hard core unlimited
在/etc/pam.d/common-session
文件和/etc/pam.d/common-session-noninteractive
文件中添加如下代码:
session required pam_limits.so
在~/.bashrc
文件中添加如下代码:
ulimit -c unlimited
执行ulimit -a
命令检查core file size是否变为unlimited:
1.2 在ROS包中添加gdb调试信息
在待调试ROS包的CMakeLists.txt
文件中添加如下代码:
SET(CMAKE_BUILD_TYPE "Debug")
SET(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb")
SET(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -O3 -Wall")
2. 修改core文件的生成目录和文件名
修改/proc/sys/kernel/core_pattern
中core文件的生成目录和文件名:
echo core | sudo tee /proc/sys/kernel/core_pattern
修改core文件的生成目录和文件名时可用的参数如下(例如,上述命令中的core
可以修改为/cores/core_%e_%t
):
参数 | 内容 |
---|---|
%e | 导致核心转储的进程对应的可执行文件名 |
%h | 发生核心转储的主机名 |
%p | 导致核心转储的进程对应的Pid |
%s | 导致核心转储的Linux信号 |
%t | 发生核心转储的时间 |
%u | 导致核心转储的进程对应的Uid |
当系统重新启动时,/proc/sys
目录中的文件会重置为默认值。若要在系统重启后保持自定义的core_pattern
设置,可以通过修改系统的启动脚本或者在启动系统时执行一个脚本来重新应用该设置。或是和我一样,需要用到gdb调试时重新执行上述命令。
3. 使用gdb调试core文件
编译ROS工作空间后,使用roslaunch执行待调试的ROS包,若ROS进程发生异常终止或崩溃,则会在$ROS_HOME下生成core文件,如未设置$ROS_HOME则默认在~/.ros
目录下生成core文件。
此时,进入到ROS工作空间目录下,可以使用gdb调试core文件:
gdb ./devel/lib/<ROS包>/<ROS节点> ~/.ros/core
之后,在gdb调试中执行bt
或where
命令即可查看相关异常,或其他gdb调试的相关用法。