我通过/proc/sys/kernel/core_pattern
从非常大的coredump收集堆栈跟踪。以下问题建议使用/proc/pid/core_filter
来减小大型coredump的大小:
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之外还有一个工具可以从这些最小的coredump中提取堆栈跟踪吗?
2)是否可以解析ELF Core文件以删除堆段?这个问题:What and where are the stack and heap?似乎表明这可能是可能的。
谢谢!
答案 0 :(得分:1)
但是,当将core_filter设置为' 0'时,生成的coredump对gdb< bt命令不再有意义。
请注意,对于动态链接的二进制文件,GDB backtrace
需要知道堆栈跟踪中出现的所有共享库(因此它可以找到相应的展开描述符)。
对于"正常"核心文件,此信息位于堆中。从core
删除堆然后会损坏info shared
,这会导致任何共享库无效的backtrace
。
您可以关闭第0位和第1位(匿名私有和共享映射,这将覆盖堆)并且仍然可以获得可用的核心如果您打开第3位(这将涵盖文本)共享库,通常不是必需的,但通过删除堆来实现。)