linux段错误调试

文章详细解释了Linux系统中进程退出状态码的意义,如ExitCode-9表示SIGKILL信号强制终止,ExitCode-11表示段错误。段错误通常是由于内存访问问题导致,如无效地址或越界。文章还介绍了如何通过Coredump进行调试,包括修改CoreDump路径、开启Coredump、使用GDB以及处理ROS程序的调试策略。
摘要由CSDN通过智能技术生成

参考:添加链接描述

错误代码

在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体系结构不兼容、二进制文件损坏或其他执行环境问题导致的。

需要注意的是,退出状态码的具体含义可以因操作系统、编程语言和应用程序而异。因此,解释退出状态码时应考虑特定的上下文和环境。


总线错误与段错误

C 总线错误 (bus error) - 段错误 (segmentation fault)

常见段错误

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阈值设置:添加链接描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值