一、首先检查
$ cat /proc/sys/kernel/core_pattern
$ cat /proc/sys/kernel/core_pattern|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
系统当前的/proc/sys/kernel/core_pattern
设置为:
|/usr/share/apport/apport -p%p -s%s -c%c -d%d -P%P -u%u -g%g -- %E
这意味着当程序崩溃时,核心转储(core dump)会被传递给apport
工具进行处理,这是Ubuntu等基于Debian的发行版中的默认行为。apport
通常用于收集崩溃信息并报告错误,但它可能不会在当前目录下生成传统的core文件。
为了在程序崩溃时生成标准的core dump文件,您常数进行以下步骤:
禁用Apport服务
首先,我们需要禁用apport
服务,以便让系统直接生成core dump文件。
方法1:临时禁用Apport
这将在当前会话中禁用apport
,但在系统重启后会恢复。
sudo systemctl stop apport.service
sudo systemctl stop apport.service
方法2:永久禁用Apport
编辑/etc/default/apport
文件,将enabled
设置为0
。
sudo sed -i 's/enabled=1/enabled=0/' /etc/default/apport
然后,停止apport
服务:
sudo systemctl stop apport.service
二、查看设置Core Dump文件大小限制
如果0,则需要设置下
$ ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 15135
max locked memory (kbytes, -l) 65536
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 15135
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
临时设置
ulimit -c unlimited
永久设置
将以下行添加到您的shell配置文件(例如,~/.bashrc
或~/.bash_profile
)中:
echo "ulimit -c unlimited" >> ~/.bashrc source ~/.bashrc
注意如果设置为0后,是不可逆的,这时候需要重启可以终端
$ ulimit -c unlimited
$ ulimit -c 0
$ ulimit -c unlimited
bash: ulimit: core file size: cannot modify limit: Operation not permitted
当你尝试执行ulimit -c unlimited
,并且遇到“Operation not permitted”错误时,可能的原因是你已经将core文件大小限制设置为0
(即禁用core dump),然后试图重新更改它。这种行为在某些系统上被认为是不可逆的,特别是在当前shell会话中。
解释与背景
在许多Linux系统中,ulimit
命令允许用户设置和查询shell及其子进程的资源限制。ulimit -c
选项用于设置core dump文件的大小限制。
- 当你设置
ulimit -c 0
时,实际上是在当前shell会话中禁用了core dump功能。 - 某些系统在你将core dump限制设置为
0
之后,会禁止在同一会话中将其再度更改为非零值。这是一种安全措施,防止用户在禁用后又意外重新启用core dump。
解决方法
1. 开启新的shell会话
因为ulimit
设置通常只在当前shell会话中生效,最简单的方法是启动一个新的shell会话,然后设置ulimit -c unlimited
。
三、检测是否加编译g标志
如果是cmake可以使用
# 如果需要调试信息,以便生成core dump,可以添加以下标志
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g")