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

Posted

技术标签:

【中文标题】掩码设置为0时不生成核心文件【英文标题】:no core file produced when mask is set to be 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 的掩码。

【问题讨论】:

【参考方案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 的报价。我只需要核心文件有堆栈和符号,所以核心文件足够小。更新了问题。有什么想法吗? 那么是的,我错过了一些东西。希望你能找到答案。

以上是关于掩码设置为0时不生成核心文件的主要内容,如果未能解决你的问题,请参考以下文章

EditPlus如何设置保存时不产生.bak备份文件?

Automake:设置数据文件权限模式

主机ip子网掩码 默认网关最后不是0,1。 linux的ip怎么设置?

主机ip子网掩码 默认网关最后不是0,1。 linux的ip怎么设置?

常用umask

word文件小数点后尾数为0时不显示