4

コアファイルをスレッドのスタックだけに減らすにはどうすればよいですか?

ミニコアでgdbを実行できるようにしたいのですが、これ以上は実行できthread apply all btません

分析に戻すには大きすぎる大きな(> 4GB)マルチスレッドLinuxELFコアファイルを扱っています。

プロセスがクラッシュしたときに「ミニダンプ」を作成するためのgoogle-breakpadを見たことがあります。google-breakpadには2つのユーティリティがcore2mdあり、minidump-2-core一見するとコアファイルをミニダンプ形式に変換し、スタック情報だけでミニダンプからコアファイルに戻すことができます。これに伴う問題は、core2mdが/ proc / $ PID /の下からのプロセス情報を必要とすることであり、それは私が持っているものではありません。

4

2 に答える 2

1

おそらく、コア ファイルから多くのデータを削除する簡単なプログラムを作成できます。

コア ファイルは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) に登録するコア ダンパーを作成することです。

于 2016-02-15T00:52:49.107 に答える