Segmentation fault (core dump) ubuntu下gdb调试

## 前言
ubuntu环境下程序运行过程中出现Segmentation fault (core dumped):
“Segmentation fault”(段错误)是一种特定于Unix操作系统的错误,表明程序试图访问其内存中不允许或不可用的区域。这通常是由于程序中的缺陷或不一致性导致的,比如数组越界、解引用空指针、栈溢出等。

这时我们可以使用调试工具:
使用gdb(GNU调试器)来运行程序,当出现段错误时,它会提供导致错误的代码位置。

## 调试 Core Dump

  1. 设置core file 路径以及大小
# 设置core文件生成路径为当前程序运行目录,且名字为core-[程序名]
sudo bash -c 'echo core-%e > /proc/sys/kernel/core_pattern'
# 设置core文件大小限制,默认最大为0,这里设置无限大
ulimit -c unlimited
  1. 查看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,使用不同的策略来定位和解决问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值