您可能可以编写一个简单的程序,从核心文件中删除大部分数据。
核心文件由PT_LOAD
代表不同 VMA 的程序头条目组成:
Program Headers:
Type Offset VirtAddr PhysAddr
FileSiz MemSiz Flags Align
NOTE 0x0000000000004b80 0x0000000000000000 0x0000000000000000
0x0000000000009064 0x0000000000000000 R 1
LOAD 0x000000000000dbe4 0x0000000000400000 0x0000000000000000
0x0000000000000000 0x000000000009d000 R E 1
LOAD 0x000000000000dbe4 0x000000000069c000 0x0000000000000000
0x0000000000004000 0x0000000000004000 RW 1
LOAD 0x0000000000011be4 0x00000000006a0000 0x0000000000000000
0x0000000000004000 0x0000000000004000 RW 1
LOAD 0x0000000000015be4 0x0000000001872000 0x0000000000000000
0x0000000000ed4000 0x0000000000ed4000 RW 1
LOAD 0x0000000000ee9be4 0x00007f248c000000 0x0000000000000000
0x0000000000021000 0x0000000000021000 RW 1
LOAD 0x0000000000f0abe4 0x00007f2490885000 0x0000000000000000
0x000000000001c000 0x000000000001c000 R 1
LOAD 0x0000000000f26be4 0x00007f24908a1000 0x0000000000000000
0x000000000001c000 0x000000000001c000 R 1
[...]
该PT_NOTE
条目包含(除其他外)有关线程状态的信息:
Displaying notes found at file offset 0x00004b80 with length 0x00009064:
Owner Data size Description
CORE 0x00000088 NT_PRPSINFO (prpsinfo structure)
[Thread #1]
CORE 0x00000150 NT_PRSTATUS (prstatus structure)
CORE 0x00000200 NT_FPREGSET (floating point registers)
LINUX 0x00000440 NT_X86_XSTATE (x86 XSAVE extended state)
CORE 0x00000080 NT_SIGINFO (siginfo_t data)
[other threads ...]
PT_NOTE 处理
您希望保留此PT_NOTE
程序标题条目。
此外,您可以从结构中提取堆栈指针prstatus
:
struct elf_prstatus {
[...]
elf_gregset_t pr_reg; /* GP registers */
[...]
};
PT_LOAD 处理
从所有线程中提取所有堆栈指针后,您可以处理PT_LOAD
条目:
如果FileSize == 0
,则该程序头不消耗核心文件中的任何内存,可以忽略;
如果某个线程的堆栈指针在这个虚拟内存区域中,这可能是一个堆栈,您可能需要保留它;
否则,您可以将其从核心文件中删除(将其替换为带有 的程序头条目FileSize == 0
)。
或者,您可以完全删除所有非堆栈区域的程序头条目。
创建您自己的核心转储程序
另一种解决方案是编写一个核心转储器,它直接生成它并在/proc/sys/kernel/core_pattern
(man core)中注册。