试图限制核心转储文件的大小。我想限制为大约4MB,所以我将其设置为1000(块,每个块为4KB)。但它并不限制核心转储文件的大小。有任何想法吗?
$ ulimit -c
1000
$ rm core; ./a.out
start...
Floating point exception (core dumped)
$ ls -l core
-rw------- 1 jin1 jin1 100405248 Nov 21 09:22 core
a.out是由一个简单的C ++源代码生成的。不要认为这很重要。
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <exception>
#include <stdexcept>
void baz() {
int a = 0;
printf("%d\n", 1/a); // causes segfault
}
void bar() { baz(); }
void foo() { bar(); }
char buf[100000000];
int main(int argc, char **argv) {
for (int i=0; i<100000000; i++)
buf[i] = 'a';
printf("start...\n");
foo();
printf("%c\n", buf[100]);
}
更新2
使用setrlimit和getrlimit更新代码段,现在我没有获得核心文件。想知道为什么。这是快速运行:
$ g++ te2.cc
$ ./a.out
start with limit: 1000 1000
Floating point exception (core dumped)
$ ls -l core
ls: cannot access core: No such file or directory
$ ulimit -c
1000
这是te2.cc的新来源
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
#include <string>
#include <exception>
#include <stdexcept>
#include <sys/resource.h>
void baz() {
int a = 0;
printf("%d\n", 1/a); // causes segfault
}
void bar() { baz(); }
void foo() { bar(); }
char buf[50000000];
int main(int argc, char **argv) {
for (int i=0; i<50000000; i++)
buf[i] = 'a';
struct rlimit n= {1000, 1000};
struct rlimit v = {0,0};
setrlimit(RLIMIT_CORE, &n);
getrlimit(RLIMIT_CORE, &v);
printf("start with limit: %ld %ld\n", v.rlim_cur, v.rlim_max);
foo();
printf("%c\n", buf[100]);
}
答案 0 :(得分:0)
在Linux Mint 17.2 64bit上我使用了ulimit -c 1000并运行了ulimit -a来确认设置了值并运行了你的样本。我的核心是:
1024000 11月21日10:43核心
在运行代码之前运行ulimit -a以确保您的设置存在。
对于软或硬设置,还可以选择运行ulimit -Sc 1000或ulimit -Hc 1000。我希望这会有所帮助。