C++ 段错误 Segmentation fault 调试

问题背景

写过 C++ 的朋友都知道,程序编译通过,并不能代表程序就是对的。在 linux 下做开发时,经常会遇到跑崩溃的情况,但是在终端只会报 Segmentation fault。如果工程代码量少,还能重新 debug一下慢慢找,对于大型工程,想短时间内找到是非常困难的。

什么是段错误(Segmentation fault)

首先我们先来搞清楚什么会导致段错误(Segmentation fault)。段错误是指硬件设备MMU(内存管理单元)发现访问了一个非法的虚拟地址,通知操作系统内核给进程发送11号信号(SIGSEGV信号),导致进程异常终止。

一般来说,段错误是由以下几个原因导致的:

  1. 访问不可访问的内存空间(如内核空间)
  2. 访问不存在的内存地址
  3. 试图写一个只读内存空间(如代码段)
  4. 栈溢出(函数递归调用太深)
  5. 使用未初始化的指针(定义时没有初始化或者已经回收)

排查段错误错误的方法包括:

  1. 检查指针:确保指针在使用之前被正确初始化,并且没有超出其所指向的内存范围。特别是当使用动态内存分配函数(如new、malloc等)时,需要确认分配的内存是否有效,使用后需要释放内存,避免悬挂指针。
  2. 数组越界:确保数组访问不越界。数组越界会导致访问无效内存区域,引发"Segmentation fault"错误。注意在使用数组时,特别是通过下

猜你喜欢

转载自blog.csdn.net/coco_1998_2/article/details/140117807