掩码设置为0时没有生成核心文件

时间:2015-11-21 00:39:29

标签: c++ linux g++

尝试创建一个没有所有内存数据转储的小型核心转储文件。 这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的掩码。

1 个答案:

答案 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。)