尝试创建一个没有所有内存数据转储的小型核心转储文件。 这question似乎有一个很好的解决方案。但是当我将掩码设置为0(以排除所有内存数据)时,没有核心文件。如果我将掩码设置为0x33,则会生成核心文件。知道为什么吗?
#include <stdio.h>
#include <execinfo.h>
#include <signal.h>
#include <stdlib.h>
#include <unistd.h>
void baz() {
int *foo = (int*)-1; // make a bad pointer
printf("%d\n", *foo); // causes segfault
}
void bar() { baz(); }
void foo() { bar(); }
int main(int argc, char **argv) {
FILE *fp = fopen("/proc/self/coredump_filter", "wb");
if (!fp) {
printf("Failed to open /proc/self/coredump_filter\n"); exit(0);
}
int mask = 0;
fprintf(fp, "%08x\n", mask);
fclose(fp);
foo(); // this will call foo, bar, and baz. baz segfaults.
}
更新1
为了澄清,我需要核心只有堆栈和符号,所以核心文件对我来说足够小。上面引用的问题提出了0的掩码。
答案 0 :(得分:0)
好吧,如果将所有位设置为零,则不必转储任何内容,因此不会生成核心文件。我错过了什么吗?
man 5 core
:
控制将哪些映射写入核心转储
从内核2.6.23开始,特定于Linux的/ proc / PID / coredump_filter file可用于控制将哪些内存段写入 核心转储文件,如果执行核心转储 使用相应的进程ID进行处理。
文件中的值是内存映射类型的位掩码(请参阅 MMAP(2))。如果在掩码中设置了一个位,则表示存储器映射 相应的类型被倾倒;否则他们不会倾倒。该 此文件中的位具有以下含义:
bit 0 Dump anonymous private mappings. bit 1 Dump anonymous shared mappings. bit 2 Dump file-backed private mappings. bit 3 Dump file-backed shared mappings. bit 4 (since Linux 2.6.24) Dump ELF headers. bit 5 (since Linux 2.6.28) Dump private huge pages. bit 6 (since Linux 2.6.28) Dump shared huge pages.
默认情况下,设置以下位:0,1,4(如果是 CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS内核配置选项是 启用),和5.可以使用启动时在启动时修改此默认值 coredump_filter启动选项。
此文件的值以十六进制显示。 (默认值 因此,值显示为33。)