【发布时间】:2015-01-19 23:52:45
【问题描述】:
我正在通过/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' 时,生成的 coredump 对 gdb 的 bt 命令不再有意义。
所以,我有以下两部分的问题:
1) 除了 gdb 之外,还有什么工具可以从这些最小的核心转储中提取堆栈跟踪吗?
2) 是否可以解析 ELF Core 文件以删除堆段?这个问题:What and where are the stack and heap? 似乎表明这是可能的。
谢谢!
【问题讨论】:
-
做到这一点应该不难。获取 ELF 规范,在一些现有的核心转储文件上使用
readelf,看看您是否可以选择性地复制一个省略您不关心的程序段的文件。 -
@KerrekSB 听起来不错 - 但是,我如何识别我不关心的细分?
-
好吧,程序头告诉你虚拟地址和段的大小......有帮助吗?
-
@KerrekSB hmmm...定位段和段的虚拟地址范围不是问题。我的问题是,我怎么知道哪些段包含堆数据,哪些包含堆栈数据?希望能澄清事情。谢谢!
-
在我的 64 位系统上,堆段似乎从“0x00007f2xxxxxxxxx”开始,堆栈在“0x00007fffxxxxxxxx”——寻找可读写的页面。
标签: c++ linux-kernel operating-system stack-trace elf