【问题标题】:no core file produced when mask is set to be 0掩码设置为0时不生成核心文件
【发布时间】:2015-11-21 00:39:29
【问题描述】:

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

【问题讨论】:

    标签: c++ linux g++


    【解决方案1】:

    好吧,如果您将所有位设置为零,则无需转储任何内容,因此不会生成核心文件。我错过了什么吗?

    man 5 core:

    控制将哪些映射写入核心转储

    自内核 2.6.23 起,Linux 特定的 /proc/PID/coredump_filter 文件可用于控制将哪些内存段写入 核心转储文件,以防为 具有相应进程 ID 的进程。

    文件中的值是内存映射类型的位掩码(参见 地图(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。)

    【讨论】:

    • 感谢@YSC 的报价。我只需要核心文件有堆栈和符号,所以核心文件足够小。更新了问题。有什么想法吗?
    • 那么是的,我错过了一些东西。希望你能找到答案。
    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 2021-05-29
    • 2013-12-09
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    相关资源
    最近更新 更多