core
大容量ファイルがあるため、書き込みに設定するように設定core_pattern
しました。gzip
後で逆追跡ファイルを取得するには、まずgunzip
完了する必要があります(時間がかかります!)、次にcore
ファイルをgdb
。
方法があるかどうか知りたい管路(core
または作成中)gdb
(またはそれを取得できる他のプログラムbacktrace
)。確認してみると、gdb
これに対するオプションがないようです(そしてありません)。このようなものを作成する前に、ELF形式(GNU / Linuxで)readelf
に次のようなものがあるかどうかを知りたいと思います。うまくいかないでしょうか?core
x86_64
- 編集する -
readelf
トレースを生成できるソースコードやその他のプログラムを見て、seek()
ファイルを渡します。戻る!これが絶対に必要かどうか、または必要なすべての情報を一度に読み取って収集できるかどうかはわかりません。 (パイプで読みたいので、ナビゲーションはオプションではありません!)
答え1
カーネルコアダンプハンドラは、ゾンビプロセスで逆追跡を生成できます。いいえまず、コアダンプがディスクに書き込まれます。
私はABRTがそうできると思いました。しかし、パッチがあるようですが、まだマージされていません。
答え2
バックトレースを作成するには、アドレスごとにメモリの内容を取得する必要があります。コアファイル内のコアに内容が含まれる各仮想アドレスは、コアファイルの特定のオフセットにあります。逆追跡を生成するコードが照会を実行するとき、その照会の宛先は、そのオフセットのアドレスにマップされたメモリー内容のオフセットです。
コアファイルをストリームとして処理するのに問題があるのは、コンテンツを取得するアドレスに対応するオフセットがインポートされるたびに増加することを期待する理由がないことです。逆さまとは、単に現在のインポートされたコンテンツが以前にインポートされたオフセットよりも小さいオフセットを持つことを意味します。
おそらく、コアファイルでバックトラッキングを構成する最も簡単なシナリオは、常にフレームポインタを使用するコードで生成されたコアファイルです。この場合、メモリの読み取りはスタックから発生し、フレームポインタ値(スタックフレームごとに1つ)はスタックフレームのリンクリストと同等です。ここで、各スタックフレームの次の単語は戻りアドレスです(関数名とオフセットにマッピングできる適切な記号がある場合)。
通常のコアファイルでアドレスが増加すると、ファイル内のオフセットも増加し、フレームポインタ値のリンクリストとして表示される一般的なトレースバックは、各連続フレームに対してより大きなフレームポインタアドレスを持ちます。フレームポインタを使用するコードのコアファイルの簡単なバックトレースは、最初にスタックポインタレジスタの値でスタックを見つけ、次にフレームポインタ値のリンクリストを繰り返して、各フレームに関連付けられた戻りアドレスを表示できます。このアプローチは、かなりの量のバッファリングを含み、主に仮想アドレスをファイルオフセットにマッピングするために使用されるコアファイルの先頭に近いプログラムセグメントヘッダである。おそらく、このアプローチの最も深刻な非効率性は、セグメントヘッダー(およびレジスタ値を取得するために使用されるコメント)と関連するスレッドスタックとの間のすべての非圧縮データが無視されることです。
フレームポインタを使用しないコードからバックトラッキングを生成することはより複雑ですが、十分なデータがバッファリングされている場合は可能です。正しいシンボルが利用可能な場合は実行可能性が高く、デバッグシンボルが利用可能な場合ははるかに実行可能です。フレームポインタのシナリオと同様に、関連するスタックからデータを取得することが不可欠です。
おそらく最善のアプローチは、最初からコアファイルをストリームとして処理するよりも、大容量のコアファイルがスペースを節約する方法を変更することです。出力の基本的な問題gzip
は、ランダムアクセスを提供しないことです。コアファイルの空間効率的な表現のためのより良いオプションは、同様の形式になります。squashfs
ここでは、一定のサイズのブロックを圧縮してランダムアクセスを提供し、これらのブロックをインデックス化して指定されたオフセットからデータを取得するには、まず場所を見つけて適切なチャンクを解凍し、圧縮されていないデータ内を検索します。
squashfs
inを使用する際の当面の課題は、標準入力をcore_pattern
呼び出す明確な方法がないことです。mksquashfs
おそらくこの問題を解決する最も簡単な方法は、コアファイルが呼び出されるのに十分な長さの圧縮されていない形式で存在するようにすることですmksquashfs
。画像に含めるには、ファイルを上下に見れば簡単です。 (わかりませんが、形式を理解すると、少なくとも可能性があることがわかります。)squashfs
mksquashfs
squashfs
squashfs
巨大なコアファイルを含むイメージがあると仮定すると、バックトラッキングを生成するツールにsquashfs
これを提供する1つの方法は、mount
イメージを簡略化し、そのマウントポイント内で関連パス名を提供することですが、デフォルトでフォーマットを処理するようにアプリケーションを修正するsquashfs
ことも可能です。 。このアプローチの利点の1つは、単純なバックトレースに加えて、コアファイルに対する他の操作も使用できることです(コア分析の次のステップは、スレッドごとに1つずつ複数のバックトレースを作成することです)。