パイプすると、GDBはコアをデコードできますか?

パイプすると、GDBはコアをデコードできますか?

core大容量ファイルがあるため、書き込みに設定するように設定core_patternしました。gzip

後で逆追跡ファイルを取得するには、まずgunzip完了する必要があります(時間がかかります!)、次にcoreファイルをgdb

方法があるかどうか知りたい管路coreまたは作成中)gdb(またはそれを取得できる他のプログラムbacktrace)。確認してみると、gdbこれに対するオプションがないようです(そしてありません)。このようなものを作成する前に、ELF形式(GNU / Linuxで)readelfに次のようなものがあるかどうかを知りたいと思います。うまくいかないでしょうか?corex86_64

- 編集する -

readelfトレースを生成できるソースコードやその他のプログラムを見て、seek()ファイルを渡します。戻る!これが絶対に必要かどうか、または必要なすべての情報を一度に読み取って収集できるかどうかはわかりません。 (パイプで読みたいので、ナビゲーションはオプションではありません!)

答え1

カーネルコアダンプハンドラは、ゾンビプロセスで逆追跡を生成できます。いいえまず、コアダンプがディスクに書き込まれます。

私はABRTがそうできると思いました。しかし、パッチがあるようですが、まだマージされていません。

答え2

バックトレースを作成するには、アドレスごとにメモリの内容を取得する必要があります。コアファイル内のコアに内容が含まれる各仮想アドレスは、コアファイルの特定のオフセットにあります。逆追跡を生成するコードが照会を実行するとき、その照会の宛先は、そのオフセットのアドレスにマップされたメモリー内容のオフセットです。

コアファイルをストリームとして処理するのに問題があるのは、コンテンツを取得するアドレスに対応するオフセットがインポートされるたびに増加することを期待する理由がないことです。逆さまとは、単に現在のインポートされたコンテンツが以前にインポートされたオフセットよりも小さいオフセットを持つことを意味します。

おそらく、コアファイルでバックトラッキングを構成する最も簡単なシナリオは、常にフレームポインタを使用するコードで生成されたコアファイルです。この場合、メモリの読み取りはスタックから発生し、フレームポインタ値(スタックフレームごとに1つ)はスタックフレームのリンクリストと同等です。ここで、各スタックフレームの次の単語は戻りアドレスです(関数名とオフセットにマッピングできる適切な記号がある場合)。

通常のコアファイルでアドレスが増加すると、ファイル内のオフセットも増加し、フレームポインタ値のリンクリストとして表示される一般的なトレースバックは、各連続フレームに対してより大きなフレームポインタアドレスを持ちます。フレームポインタを使用するコードのコアファイルの簡単なバックトレースは、最初にスタックポインタレジスタの値でスタックを見つけ、次にフレームポインタ値のリンクリストを繰り返して、各フレームに関連付けられた戻りアドレスを表示できます。このアプローチは、かなりの量のバッファリングを含み、主に仮想アドレスをファイルオフセットにマッピングするために使用されるコアファイルの先頭に近いプログラムセグメントヘッダである。おそらく、このアプローチの最も深刻な非効率性は、セグメントヘッダー(およびレジスタ値を取得するために使用されるコメント)と関連するスレッドスタックとの間のすべての非圧縮データが無視されることです。

フレームポインタを使用しないコードからバックトラッキングを生成することはより複雑ですが、十分なデータがバッファリングされている場合は可能です。正しいシンボルが利用可能な場合は実行可能性が高く、デバッグシンボルが利用可能な場合ははるかに実行可能です。フレームポインタのシナリオと同様に、関連するスタックからデータを取得することが不可欠です。

おそらく最善のアプローチは、最初からコアファイルをストリームとして処理するよりも、大容量のコアファイルがスペースを節約する方法を変更することです。出力の基本的な問題gzipは、ランダムアクセスを提供しないことです。コアファイルの空間効率的な表現のためのより良いオプションは、同様の形式になります。squashfsここでは、一定のサイズのブロックを圧縮してランダムアクセスを提供し、これらのブロックをインデックス化して指定されたオフセットからデータを取得するには、まず場所を見つけて適切なチャンクを解凍し、圧縮されていないデータ内を検索します。

squashfsinを使用する際の当面の課題は、標準入力をcore_pattern呼び出す明確な方法がないことです。mksquashfsおそらくこの問題を解決する最も簡単な方法は、コアファイルが呼び出されるのに十分な長さの圧縮されていない形式で存在するようにすることですmksquashfs。画像に含めるには、ファイルを上下に見れば簡単です。 (わかりませんが、形式を理解すると、少なくとも可能性があることがわかります。)squashfsmksquashfssquashfssquashfs

巨大なコアファイルを含むイメージがあると仮定すると、バックトラッキングを生成するツールにsquashfsこれを提供する1つの方法は、mountイメージを簡略化し、そのマウントポイント内で関連パス名を提供することですが、デフォルトでフォーマットを処理するようにアプリケーションを修正するsquashfsことも可能です。 。このアプローチの利点の1つは、単純なバックトレースに加えて、コアファイルに対する他の操作も使用できることです(コア分析の次のステップは、スレッドごとに1つずつ複数のバックトレースを作成することです)。

関連情報