参考:添加链接描述
错误代码
在Linux和Unix系统中,进程退出时会返回一个退出状态码(Exit Code)。这个退出状态码用于指示进程终止的原因。以下是常见的一些退出状态码及其含义:
0:表示进程成功终止。
-1:表示进程非正常终止,但没有明确的错误代码。
1-125:表示进程非正常终止,具体的含义可以根据程序或操作系统的约定进行解释。
这些退出状态码通常是预定义的,例如,程序可以在特定情况下使用不同的状态码来表示不同的错误。
现在针对您提到的特定退出状态码进行解释:
Exit Code -9:这表示进程收到了一个信号,信号编号为9。在Linux中,信号9是SIGKILL,它是一个无法捕获和忽略的强制终止信号。当进程接收到SIGKILL信号时,它会立即终止,不允许进行任何清理或资源释放。
Exit Code -11:这表示进程由于一个段错误(Segmentation Fault)而非正常终止。段错误通常是由于访问了无效的内存地址或内存访问越界引起的。这可能是程序中存在的编程错误或内存管理问题导致的。
Exit Code -6:这表示进程由于一个非法指令(Illegal Instruction)而非正常终止。非法指令通常是由于尝试执行不支持的或未定义的指令而引起的。这可能是由于CPU体系结构不兼容、二进制文件损坏或其他执行环境问题导致的。
需要注意的是,退出状态码的具体含义可以因操作系统、编程语言和应用程序而异。因此,解释退出状态码时应考虑特定的上下文和环境。
总线错误与段错误
常见段错误
1.访问不存在的内存、访问未知的受保护的内存
2.访问未初始化的指针
3.写常量区(只读区)
4.在栈中定义过大的数组,导致进程的栈空间不足
5.数据类型格式转换错误
6.4G的buffer会导致IO出现段错误
7.main函数递归调用导致栈溢出
8.数组读写越界(不一定会导致段错误,但一定会踩(覆盖)了其它数据)
9.使用局部变量返回值(错误未知,有可能产生断错误)
10.使用已经释放的堆内存(错误未知,有可能产生断错误)
11.当堆内存耗尽
12.重复free,delete内存,程序将收到信号SIGABRT,然后退出。
coredump调试
1.修改 Core Dump 文件产生路径和文件名,参考:三步搞定 ROS 进程崩溃 - Core Dump(亲测20.04同样适用)
(1)Ubuntu18.04 中默认值为 apport,必须替换掉!
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P %E
(2)生成到当前目录下
echo core-%e-%p-%s-%t | sudo tee /proc/sys/kernel/core_pattern
(3)指定 core dump 文件保存位置
echo "/home/cxf/coredump/core-%e-%p-%s-%t" > /proc/sys/kernel/core_pattern
在模板中,可以使用以下占位符:
%e:可执行文件名
%p:进程ID
%u:当前用户ID
%g:当前用户组ID
%s:生成Coredump文件时的信号,参考:Linux内核调试方法总结之coredump
%t:生成Coredump文件时的时间戳
%h:主机名
2.开启coredump:
ulimit -c unlimited
3.gdb调试core dump文件:(-q:表示屏蔽GDB打印的免责声明)
gdb <exefile> <corefile> -q
4.查看调用堆栈: bt
5.ROS程序coredump调试,参考: 三步搞定 ROS 进程崩溃 - Core Dump(亲测20.04同样适用)
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")
查看系统被杀死进程
dmesg
cat /var/log/syslog: 查看系统杀死的进程
Out of memory阈值设置:添加链接描述