问题现象
-
在程序启动脚本中设置了ulimit -c unlimited,但是查看系统环境ulimit -c却未生效,仍显示0
-
脚本如下
#! /bin/bash ulimit -c unlimited echo "password" | sudo -S sysctl -w kernel.core_pattern=/your_path/core.%e.%p.%t.%s ./test/main # 执行程序
问题原因
-
shell脚本中执行该命令,shell中内置命令只会影响当前shell会话及其子进程
-
也就是说
- 如果在脚本内设置了ulimit -c unlimited并同时启动程序,程序出现coredump是能记录core文件的
- 但是脚本结束后再单独启动程序,ulimit -c unlimited可能没生效,程序奔溃后也未能记录core文件
测试程序
-
main.cpp
include <iostream> include <string> using namespace std; int main() { std::string my_str = “abcdef”; auto* str_ptr = &my_str; str_ptr[1] = 'g'; return 0; }
-
编译
g++ -o main main.cc
-
start.sh
#! /bin/bash ulimit -c unlimited echo "password" | sudo -S sysctl -w kernel.core_pattern=/your_path/core.%e.%p.%t.%s ./main
-
./start.sh启动程序出现coredump后,因为在同一会话中会保存core文件
解决方法
-
要永久修改core文件限制,需修改系统的配置文件 /etc/security/limits.conf
#* soft core 0 修改为 #* soft core unlimited # 为所有用户设置无限制大小的core dump文件
-
请注意,core dump文件可能占用大量磁盘空间,需确保指定路径有足够的可用空间
created by shuaixio, 2024.04.04