## 前言
ubuntu环境下程序运行过程中出现Segmentation fault (core dumped):
“Segmentation fault”(段错误)是一种特定于Unix操作系统的错误,表明程序试图访问其内存中不允许或不可用的区域。这通常是由于程序中的缺陷或不一致性导致的,比如数组越界、解引用空指针、栈溢出等。
这时我们可以使用调试工具:
使用gdb(GNU调试器)来运行程序,当出现段错误时,它会提供导致错误的代码位置。
## 调试 Core Dump
- 设置core file 路径以及大小
# 设置core文件生成路径为当前程序运行目录,且名字为core-[程序名]
sudo bash -c 'echo core-%e > /proc/sys/kernel/core_pattern'
# 设置core文件大小限制,默认最大为0,这里设置无限大
ulimit -c unlimited
- 查看core file 路径以及大小
# 查看core文件生成路径
sysctl kernel.core_pattern
# 查看core文件限制大小
ulimit -a | grep core
## 编译运行
终端下运行你的代码,如:./igo_fusion
报错后在当前目录下会产生名字为core-[程序名]的core文件
gdb 调试
# gdb [可执行程序程序名称] [core文件名称]
gdb ./igo_fusion core-igo_fusion
# quit 退出gdb调试
加载核心转储:
如果程序崩溃时生成了核心转储文件,您可以在gdb中加载它。启动gdb后,使用core命令加载核心转储:
(gdb) core ../igo_fusion.core
查看崩溃信息:
使用backtrace或bt命令查看崩溃发生时的调用栈:
(gdb) backtrace
检查调用栈顶部:
通常,调用栈的顶部(#0)是发生段错误的代码位置。使用frame命令查看特定帧的详细信息:
(gdb) frame 0
查看源代码:
使用list命令查看当前帧的源代码:
(gdb) list
检查局部变量和寄存器:
使用info locals查看局部变量,使用info registers查看寄存器状态:
(gdb) info locals
(gdb) info registers
检查指针和内存访问:
确保没有空指针解引用、越界访问或错误的内存访问。检查所有指针操作。
设置断点:
在源代码中的特定位置或函数设置断点,然后重新运行程序,以便在到达这些点时停止执行:
(gdb) break filename.cpp:42
(gdb) break functionName
单步执行:
当程序在断点处停止时,使用step或next命令单步执行代码:
(gdb) step
(gdb) next
继续执行直到崩溃:
使用continue命令继续执行程序,直到再次遇到段错误。
(gdb) continue
分析和修复:
根据在gdb中收集的信息,分析可能导致段错误的原因,并在代码中进行修复。
退出gdb:
使用quit命令退出gdb。
(gdb) quit
调试段错误可能需要耐心和细致的检查。确保您的代码正确处理了所有内存访问,并且没有违反C++的内存管理规则。如果问题复杂,您可能需要多次进入gdb,使用不同的策略来定位和解决问题。