C++ 是否可以从ELF核心文件中删除堆?

C++ 是否可以从ELF核心文件中删除堆?,c++,linux-kernel,operating-system,stack-trace,elf,C++,Linux Kernel,Operating System,Stack Trace,Elf,我正在通过/proc/sys/kernel/core\u模式从非常大的CoreDump收集堆栈跟踪。以下问题建议使用/proc/pid/core\u filter来减小大型CoreDump的大小: 但是,当将core_filter设置为“0”时,生成的coredump对gdb的bt命令不再有意义 因此,我有以下两部分的问题: 1) 除了gdb之外,还有什么工具可以从这些最小的CoreDump中提取stacktrace 2) 是否可以解析ELF核心文件以删除堆段?这个问题:似乎表明这是可能的

我正在通过
/proc/sys/kernel/core\u模式
从非常大的CoreDump收集堆栈跟踪。以下问题建议使用
/proc/pid/core\u filter
来减小大型CoreDump的大小:

但是,当将core_filter设置为“0”时,生成的coredump对gdb的bt命令不再有意义

因此,我有以下两部分的问题:

1) 除了gdb之外,还有什么工具可以从这些最小的CoreDump中提取stacktrace

2) 是否可以解析ELF核心文件以删除堆段?这个问题:似乎表明这是可能的

谢谢

但是,当将core_filter设置为“0”时,生成的coredump对gdb的bt命令不再有意义

请注意,对于动态链接的二进制文件,GDB
backtrace
需要了解堆栈跟踪中出现的所有共享库(以便它可以找到相应的展开描述符)

对于“普通”核心文件,此信息位于堆中。从
core
中删除堆会损坏
info shared
,这反过来会使具有任何共享库的
backtrace
无法工作


如果打开第3位(它将覆盖共享库的文本,通常不需要,但通过删除堆而变得必要),您可能可以关闭第0位和第1位(匿名私有和共享映射,这将覆盖堆),并且仍然可以获得可用的内核。

这样做应该不会太困难。抓取ELF规范,在一些现有的核心转储文件上使用
readelf
,看看是否可以选择性地复制一个忽略了您不关心的程序段的文件。@KerrekSB听起来不错-但是,我如何识别我不关心的程序段呢?嗯,程序头告诉您虚拟地址和段的大小。。。这有用吗?@KerrekSB-hmmm。。。定位段和段的虚拟地址范围不是问题。我的问题是,如何知道哪些段包含堆数据,哪些段包含堆栈数据?希望这能澄清问题。谢谢在我的64位系统上,堆段似乎从“0x00007f2xxxxxxxxx”开始,堆栈位于“0x00007FFFXXXXXXXXXX”--查找可读写页面。感谢您提供的信息!我尝试将core_filter设置为24(0x18),但由于
gdb bt
,核心仍然不可用。不过,额外的见解很有帮助。我发现了这篇文章:它只保留了堆栈中的程序段。我怀疑这在x86_64上是否有效——你怎么看?