c++ - 是否可以从 ELF Core 文件中删除堆?

标签 c++ linux-kernel operating-system stack-trace elf

我正在通过 /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/

相关文章:

c++ - "recursive on all control paths, function will cause runtime stack overflow"重载 << 运算符

linux - 如何在 32 位 Linux 上配置用户空间结束地址

c - 编写字符设备驱动程序,ioctl() 与普通读/写?

c - 多次运行之间同一程序的不同缓存未命中计数

c - 操作系统提供哪些服务来执行C程序

c++ - 如何不断从 vector 中删除奇数位置的值,直到只剩下一个?

c++ - 无法包含 ifstream "fatal error: ' ifstream' 找不到文件”

rust - 如何使用 Assembly (NASM) 引导加载程序编译 Rust 内核

c++ - 通用重载运算符

c - "Getting"Linux 中的路径