段错误核心转储

在linux下运行可执行文件的时候出现了以下错误:

error:segmentation fault core dumped

解决方法:

#查看core文件大小判断是否可写
$ ulimit -a
real-time non-blocking time  (microseconds, -R) unlimited
core file size              (blocks, -c) unlimited
data seg size               (kbytes, -d) unlimited
scheduling priority                 (-e) 0
file size                   (blocks, -f) unlimited
pending signals                     (-i) 31265
max locked memory           (kbytes, -l) 1010876
max memory size             (kbytes, -m) unlimited
open files                          (-n) 1024
pipe size                (512 bytes, -p) 8
POSIX message queues         (bytes, -q) 819200
real-time priority                  (-r) 0
stack size                  (kbytes, -s) 8192
cpu time                   (seconds, -t) unlimited
max user processes                  (-u) 31265
virtual memory              (kbytes, -v) unlimited
file locks                          (-x) unlimited
#如果core file size是0就需要修改文件大小
$ ulimit -c unlimited
#查看是否修改成功
$ ulimit -c
unlimited
#通过man 5 core查看core文件路径
$ man 5 core
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
# 使用echo来修改文件路径发现权限不够
$ echo "/home/wm/projects/Webserver/bin/core-%e-%p-%t"> /proc/sys/kernel/core_pattern
bash: /proc/sys/kernel/core_pattern: Permission denied
# 使用命令关闭apport.service服务
$ sudo systemctl disable apport.service
# 查看core路径
$ cat /proc/sys/kernel/core_pattern
core
#再次运行发现生成core
$ ll
total 8880
drwxrwxr-x 2 wm wm     4096  817 09:50 ./
drwxrwxr-x 8 wm wm     4096  816 22:56 ../
-rw------- 1 wm wm 71880704  817 09:50 core.33594

然后gdb测试

#启动gdb
gdb 可执行文件 core

在这里插入图片描述
使用bt命令回溯详细错误:
在这里插入图片描述

段错误原因

Segmentation fault (core dumped)多为内存不当操作造成。空指针、野指针的读写操作,数组越界访问,破坏常量等。对每个指针声明后进行初始化为NULL是避免这个问题的好办法。排除此问题的最好办法则是调试。
更为详细的原因:
(1)内存访问越界
a) 由于使用错误的下标,导致数组访问越界
b) 搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符
c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。应该使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函数防止读写越界。

(2)多线程程序使用了线程不安全的函数。
(3)多线程读写的数据未加锁保护。
对于会被多个线程同时访问的全局数据,应该注意加锁保护,否则很容易造成core dump
(4)非法指针
a) 使用空指针
b) 随意使用指针转换。一个指向一段内存的指针,除非确定这段内存原先就分配为某种结构或类型,或者这种结构或类型的数组,否则不要将它转换为这种结构或类型的指针,而应该将这段内存拷贝到一个这种结构或类型中,再访问这个结构或类型。这是因为如果这段内存的开始地址不是按照这种结构或类型对齐的,那么访问它时就很容易因为bus error而core dump.
(5)堆栈溢出。
不要使用大的局部变量(因为局部变量都分配在栈上),这样容易造成堆栈溢出,破坏系统的栈和堆结构,导致出现莫名其妙的错误。

原文链接:

段错误
段错误

### 解析段错误及其解决方案 #### 段错误概述 段错误Segmentation Fault)是一种常见的程序崩溃现象,在 Linux 系统中尤为常见。当程序试图访问未分配给它的内存区域时,操作系统会发送 SIGSEGV 信号给该进程并终止其执行[^3]。 #### 核心转储的作用 核心转储(Core Dump)是指在程序异常退出时,操作系统自动保存当时程序的内存状态到一个名为 core 的文件中。这个文件对于开发者来说非常有价值,因为它可以帮助追踪导致崩溃的具体原因和上下文环境[^2]。 #### 原因分类 造成段错误的主要原因是非法内存操作,具体可分为以下几类: - 访问不存在或超出范围的数组索引; - 尝试修改常量字符串或其他不可变对象的内容; - 使用已经释放掉的空间指针再次进行读写操作; - 调用栈溢出等其他形式的缓冲区溢出漏洞; 这些行为都会触发 CPU 提供的安全机制来阻止潜在危险的操作,并最终引发段错误中断程序正常流程。 #### 配置 Core 文件生成路径 为了更好地捕获和分析问题所在,建议先设置好允许创建较大尺寸的核心转储文件以及指定它们被放置的位置。可以通过调整 `/etc/security/limits.conf` 中的相关参数实现这一点,例如增加如下配置项: ```bash * soft core unlimited * hard core unlimited ``` 另外还需要确保内核也支持此功能开启,默认情况下某些发行版可能禁用了这项特性。编辑 `/proc/sys/kernel/core_pattern` 或者通过 sysctl 工具临时启用它: ```bash echo "/tmp/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern sudo sysctl -w kernel.core_pattern=/tmp/core.%e.%p ``` 这里定义了一个模板化的命名模式以便区分不同应用程序产生的日志记录[^4]。 #### 利用 GDB 进行调试 一旦获得了有效的 core 文件之后就可以借助 GNU Debugger (GDB) 来加载并查看其中的信息了。启动命令通常类似于这样: ```bash gdb ./your_program_name path_to_core_file ``` 进入交互界面后可以输入 `bt` 查看调用堆栈跟踪信息从而快速锁定可疑位置;也可以配合源码逐步单步执行进一步探究根本成因。 #### Python 特定情况处理 针对提到的 Theano 库无法初始化 PyGPU 支持的情况,则可能是由于 GPU 设备驱动版本兼容性不佳或者是缺少必要的依赖库所引起的。此时应当确认安装了最新稳定版 NVIDIA CUDA Toolkit 和 cuDNN SDK 同时验证显卡驱动是否处于良好工作状态下再重试一次[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值