我正在通过 /proc/sys/kernel/core_pattern
从非常大的核心转储中收集堆栈跟踪。以下问题建议使用 /proc/pid/core_filter
来减少大型核心转储的大小:
Minimal core dump (stack trace + current frame only)
Selective core dump in Linux - How can I select the dumped sections?
Is it possible to get a Linux coredump that only contains callstack, threads, and local variables?
但是,当将 core_filter 设置为“0”时,生成的核心转储对 gdb 的 bt 命令不再有意义。
所以,我有以下两部分问题:
1) 除了 gdb 之外,还有其他工具可以从这些最小的核心转储中提取堆栈跟踪信息吗?
2) 是否可以解析 ELF 核心文件以删除堆段?本题:What and where are the stack and heap?似乎表明这可能是可能的。
谢谢!
最佳答案
But, when setting core_filter to '0', the resulting coredump is no longer meaningful to gdb's bt command.
请注意,对于动态链接的二进制文件,GDB backtrace
需要知道出现在堆栈跟踪中的所有共享库(以便它可以找到相应的展开描述符)。
对于“普通”核心文件,此信息位于堆 中。从 core
中删除堆会损坏 info shared
,这反过来又会使具有任何共享库的 backtrace
无法正常工作。
您可以关闭第 0 位和第 1 位(匿名私有(private)和共享映射,这将覆盖堆)并且仍然可以获得可用的核心如果您打开第 3 位(这将覆盖文本共享库,这通常不是必需的,但通过删除堆是必需的)。
关于c++ - 是否可以从 ELF Core 文件中删除堆?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27068070/