Ubuntu c++ 程序查找 Segmentation fault (core dump)错误
Ubuntu c++ 程序查找 Segmentation fault (core dump) 错误
ubuntu c++ 程序查找 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
结束语
本文主要为自己的备忘录使用,有什么错误或者需要补充的地方,希望大佬们可以帮忙指正。
更多推荐
所有评论(0)