掩码设置为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时不生成核心文件的主要内容,如果未能解决你的问题,请参考以下文章
主机ip子网掩码 默认网关最后不是0,1。 linux的ip怎么设置?