Linux 避免在核心文件中转储信息

Linux 避免在核心文件中转储信息,linux,memory,core,coredump,Linux,Memory,Core,Coredump,我希望避免在崩溃时将程序中的某些信息转储到核心文件中 为此,我可以使用coredump\u过滤器() 手册页提供以下说明 文件中的值是内存映射类型的位掩码(请参阅 mmap(2))。如果在掩码中设置了位,则 对应的类型被转储;否则它们不会被丢弃。这个 此文件中的位具有以下含义: bit 0 Dump anonymous private mappings. bit 1 Dump anonymous shared mappings. bit 2 Dum

我希望避免在崩溃时将程序中的某些信息转储到核心文件中

为此,我可以使用coredump\u过滤器()

手册页提供以下说明

文件中的值是内存映射类型的位掩码(请参阅 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.
我想知道在我的情况下设置和重置哪个位。我不清楚这些领域,特别是私人和共享的


我在内存中有一个缓冲区(无符号字符*)。我不想在任何崩溃的情况下将其转储到核心文件中。是否有任何特定的标志我必须使用mmap?请帮忙。提前感谢。

coredump\u filter
只会设置进程全局设置,因此它基本上只允许您转储所有内存或无内存

但是,
madvise
有一个标志,它可能做一些更接近您想要做的事情:
MADV\u DONTDUMP
。它将标记特定内存页不出现在coredump中。不过,您的程序需要自行运行
madvise
;您不能从进程外部设置它(我想,除了使用
gdb


但请注意,
madvise
仅在整个页面上运行。您不能将标志“This 193 bytes”或类似的内容设置为不转储。如果标记缓冲区所在的页面,则该页面的其余部分也不会被转储。如果这对您来说是个问题,我想您只需要在缓冲区中
mmap
,而不是
malloc
,这样它就可以单独在一个页面中了。

这些位都不能帮助您专门过滤出缓冲区。例如,它们可以过滤掉所有的私有内存,但你可能还是不首先转储内核为好。那么你的意思是没有办法过滤要转储到内核文件中的缓冲区。至少不使用
coredump\u filter
,但这并不是说这是不可能的。我有一个线索,我会写一个答案。你会考虑选择编辑核心文件后,它已被创建?完全同意你,MDEX可以使用标志MavdyDoToDip。但是,此选项自Linux3.4起就可用。我使用的是2.6.32版。所以我们也不能使用这个解决方案。@ank:不过,我认为没有其他选择。除了用
MADV\u DONTDUMP
代码修补2.6.32内核之外,我猜是这样的: