Win10 WSL2 Ubuntu18.04 发生 Segmentation fault 后,如何调试

作者:神秘网友 发布时间:2020-09-09 12:45:39

Win10 WSL2 Ubuntu18.04 发生 Segmentation fault 后,如何调试

Win10 WSL2 Ubuntu18.04 发生 Segmentation fault 后,如何调试

问题由来

今天某个同学问我,说自己写了一个很长的代码,使用 -O0 编译的时候没有问题,使用 -O2 编译,就会产生 Segmentation fault,然后程序就结束了,百思不得其解。

这个问题很简单:

1、使用 -O0 的编译的时候,系统是不会优化代码的。

2、使用 -O2 的编译的时候,系统是会优化代码的。

3、这个问题产生的原因大概率是以下几个可能:非法指针、数组访问越界、类构造函数等。

那么如何如何定位问题呢?其实 Linux 下有强大的 gdb,加上代码 Segmentation fault 后产生的 core 文件,我们就可以非常容易定位问题。不需要逐一阅读代码。

运行环境

Win10 + WSL2 + Ubuntu 18.04

在 Ubuntu 中设置 ulimit

$ sudo vim /etc/profile 

在文件中添加一下

ulimit -c unlimited

在命令行中验证设置。

Win10 WSL2 Ubuntu18.04 发生 Segmentation fault 后,如何调试

可以看到 ulimit 已经发生作用。

测试代码

测试代码如下。

#include <iostream>
#include <cstdio>
using namespace std;
int main() {
        int *p=NULL;
        *p=10;
        cout<<*p<<"\n";
        return 0;
}

上面代码,我们知道 *p=10; 这句话将导致 Segmentation fault。

$ g++ -g test.cpp -o test
[email protected]:~$ ./test
Segmentation fault (core dumped)
[email protected]:~$ ls -l
total 256
-rw------- 1 zhouyi zhouyi 491520 Sep  8 16:00 core
-rwxr-xr-x 1 zhouyi zhouyi  28776 Sep  8 15:47 test
-rw-r--r-- 1 zhouyi zhouyi    124 Sep  8 15:47 test.cpp

我们可以看到在当前目录下已经产生出对应的 coredump 文件。

对应的命令行为

$ gdb ./test core

运行的结果如下图。

Win10 WSL2 Ubuntu18.04 发生 Segmentation fault 后,如何调试

好了,已经告诉你哪里除了问题,如上图红色框所示。

也可以在 gdb 中增加 bt 命令,来看调用的堆栈情况。如下图所示。

Win10 WSL2 Ubuntu18.04 发生 Segmentation fault 后,如何调试

Enjoy it.

Win10 WSL2 Ubuntu18.04 发生 Segmentation fault 后,如何调试相关教程

  1. Win7/Win10移动用户文件夹(C:\Users)移到非系统盘(如D:)
  2. WIN10安装MYSQL教程
  3. 在win10/win7 64位系统上安装 hp laserjet 1015对应的打印机驱动
  4. 2020年win10最常用dos命令以及win+R即可运行的命令(使用命令打
  5. win10 5.6.35MySQL主从同步配置
  6. win10系统下python3新手教程
  7. Win10配置安装Kafka
  8. Win10+ IDEA NiFi源码编译配置