😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。
在Linux系统中,程序运行时可能会遇到段错误(Segmentation Fault),这是一种常见的运行时错误,通常由于程序试图访问其内存空间中未分配(或不允许)的部分时发生。
当段错误发生时,系统可能会生成一个核心转储(core dump),它是一个包含程序终止时的内存映像的文件,可以用于后续的调试和问题分析。 本文将探讨如何分析段错误,并利用核心转储文件定位问题。
段错误发生的原因可能包括但不限于:
段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gd tr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的 gdt表,后13位保存 相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向 的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的
一旦一个程序发生了越界访问,cpu就会产生相应的保护,于是segmentation fault就出现了通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。# 二、核心转储文件
当程序因段错误而终止时,如果系统配置允许生成核心转储,将创建一个core文件(或类似的命名模式),这个文件包含了程序终止时的内存映像。
其实系统会在程序崩溃的那一刹那将整个内核的信息记录在一个文件里边,(ls 并不会看到这个文件)
确保/proc/sys/kernel/core_pattern配置允许生成核心转储文件。
设置ulimit以允许生成核心文件:
/etc/profile中加入以下一行,这将允许生成coredump文件
ulimit-c unlimited
编译的时候一定要加入-g选项,要不然在最后显示错误的时候只会显示错的地址,而不会显示错误的具体信息。
/proc/sys/kernel/core_uses_pid可以控制core文件的文件名中是否添加pid作为扩展。文件内容为1,表示添加pid作为扩展名,生成的core文件格式为core.xxxx;为0则表示生成的core文件同一命名为core。
可通过以下命令修改此文件:
echo "1" > /proc/sys/kernel/core_uses_pid
一般core路径和可执行程序一个路径。
除此之外,还可以在/proc/sys/kernel/core-pattern里设置core文件的文件名模板。
echo /data/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
gdb /path/to/program /path/to/coredump