Ubuntu c++ 程序查找 Segmentation fault (core dump)错误

前言

ubuntu环境下程序运行过程中突然出现Segmentation fault (core dumped),往往会无从下手,今天带来程序出现Segmentation fault (core dumped)的错误定位的方法。

环境

ubuntu: 18.04
gcc版本: 7.5.0

C++例子

//helloCoreDump.cpp
#include <iostream>

int main()
{

    char *ptr = NULL;
    *ptr = 10;  //trying to access unknown memory location

    return 0;
}

调试 Core Dump

1. 设置core file 路径以及大小

# 设置core文件生成路径为当前程序运行目录,且名字为core-[程序名]
sudo bash -c 'echo core-%e > /proc/sys/kernel/core_pattern'
# 设置core文件大小限制,默认最大为0,这里设置无限大
ulimit -c unlimited

2. 查看core file 路径以及大小

# 查看core文件生成路径
sysctl kernel.core_pattern
# 查看core文件限制大小
ulimit -a | grep core

在这里插入图片描述

3. 编译

3.1 gcc 编译

# g++ -g -o [可执行程序程序名称] [编译文件名称]
g++ -g -o helloCoreDump helloCoreDump.cpp 

3.2 cmake 编译

编写CMakeLists.txt

project(coreDumpTest)

set(CMAKE_CXX_FLAGS "-g")	# 设置调试信息

add_executable(helloCoreDump helloCoreDump.cpp)

编译

mkdir build
cd build/
cmake ..
make

4. gdb 调试

# gdb [可执行程序程序名称] [core文件名称]
gdb ./helloCoreDump core-helloCoreDump
# quit 退出gdb调试

在这里插入图片描述
在这里插入图片描述

拓展

核心转储(core dump),在汉语中有时戏称为吐核,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件。这种信息往往用于调试。核心转储_百度百科

CorePattern 配置

临时配置

CorePattern 通过/proc/sys/kernel/core_pattern配置

# 设置core文件生成路径为当前程序运行目录,且名字为core-[程序名]
sudo bash -c 'echo core-%e > /proc/sys/kernel/core_pattern'

coredump配置、产生、分析以及分析示例
%p 出Core进程的PID
%u 出Core进程的UID
%s 造成Core的signal号
%t 出Core的时间,从1970-01-0100:00:00开始的秒数
%e 出Core进程对应的可执行文件名

永久配置

但是当我们重启之后,使用sysctl kernel.core_pattern查看,发现又变成了默认的core, 所以这个时候我们需要在/etc/sysctl.conf 添加core_pattern的默认配置

# 根据个人需求更改
kernel.core_pattern = core-%e

到此为止,你以为永久配置完就结束了嘛,不一定哈! 如果你的/proc/sys/kernel/core_pattern的值是core的话,请忽略下面内容,如果是kernel.core_pattern = |/usr/share/apport/apport %p %s %c %d %P的话,接着往下看。
在这里插入图片描述
这种情况下系统重启后core_pattern的值会被apport服务给修改掉,这会导致/etc/sysctl.conf 下的设置失效,所以我们需要停止并禁止apport服务。

#ubuntu 18的解决方案,其他版本自行百度
# 查看当前系统中服务状态
service --status-all
sudo systemctl stop apport.service
sudo systemctl disable apport.service

ulimit core file size 永久配置

/etc/security/limits.conf中添加以下两行内容,注意复制*,代表所用用户。

#<domain>    <type>  <item>         <value>
*            soft    core           unlimited
*            hard    core           unlimited

结束语

本文主要为自己的备忘录使用,有什么错误或者需要补充的地方,希望大佬们可以帮忙指正。

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值