おそらく、コア ファイルから多くのデータを削除する簡単なプログラムを作成できます。
コア ファイルは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) に登録するコア ダンパーを作成することです。