6

デバッグ シンボルを持たないプログラムのコア ダンプに格納されているフレームにアクセスしたい (C でこれを行いたい)。プログラムと GDB 内のコア ダンプを開くと、関数の名前を含むスタック トレースが表示されます。例えば:

(gdb) bt
#0  0x08048443 in layer3 ()
#1  0x08048489 in layer2 ()
#2  0x080484c9 in layer1 ()
#3  0x0804854e in main ()

すべての関数の名前は、実行可能ファイルの .strtab セクションに保存されます。異なるフレームでスタック トレースを構築するにはどうすればよいですか? GDB をバッチ モードで実行することはオプションではありません。また、コードが独立して書かれていないため、「必要な部分をgdbからコピーする」だけでも悪い考えです。

私の質問をより正確にするために、スタック情報の読み取りを開始できるコアダンプ内のポイントはどこにありますか? それらの情報にアクセスするための何らかのライブラリはありますか? 使用できる構造体? またはさらに良いのは、これらの情報がコア ダンプ内でどのように構造化されているかのドキュメントですか?

(「 gdbなどの外部ツールを呼び出さずに、C言語でコアダンプファイルからスタックトレースを生成する方法」という質問はすでに見ましたが、有効な回答がないので、もう一度質問しようと思いました)

[編集] Linux x86でこれをやっています

4

1 に答える 1

6

コアダンプにはスタック情報も含まれています。このスタック情報をコアダンプ ファイル内の EBP および EIP レジスタ値と共に使用できる場合は、スタック トレースを出力できます。私はこれを行うためのプログラムを書いていました。以下のリンクでプログラムを見つけることができます。

    http://www.emntech.com/programs/corestrace.c

使用法: 上記のプログラムをコンパイルし、実行時にコアファイルを提供します。

       $corestrace core

シンボルも出力したい場合は、次のようにします: コアを生成したプログラムが「test」であると仮定しましょう。

       $ nm -n test > symbols
       $ corestrace core symbols

サンプル出力は次のようになります。

       $ ./coretrace core symbols 

        0x80483cd foo+0x9
        0x8048401 func+0x1f
        0x8048430 main+0x2d
于 2012-05-15T12:55:51.703 に答える