2012-04-16 16 views
3

次のように私は、単純なtest.ccを書いた:なぜgdbの関数に入ることができないのですか?

#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "Hello world" << endl; 
    return 0; 
} 

を私はしてコンパイル:

g++ -g test.cc -o test.o 

私はgdbを実行し、"Hello world"行にブレークポイントを置く:次に

$ gdb test.o 
(gdb) b 7 
(gdb) c 

gdb"Hello world"行で停止しますが、実行すると

(gdb) s 

cout機能に入ることができません。だから私の質問は、私はcout機能にステップインできますか?

+2

「cout」は価値があるのですが、関数ではありません。あなたは関数 'operator <<'を探しています。 –

答えて

6

デバッグ情報を持つ標準ライブラリのバージョンとリンクされていない場合、ライブラリにステップインする方法はわかりません。 (つまり、コントロールがデバッグ情報を含むコードに戻るまで実行されます)。

標準のCおよびC++ライブラリのデバッグバージョンのインストール方法については、ご使用のシステムのマニュアルを参照してください。

+0

はい、あなたの答えは私が期待していたものです。必要な情報を追加する必要があります。 – stackunderflow

+0

上記の質問は私の本当のポイントではありません。私の別のプログラムでは、別のファイルの関数(標準のC/C++ライブラリではない)にステップインしようとしました。しかし、失敗し、 ".gdbinit:そのようなファイルやディレクトリはありません"、 "共有ライブラリイベントのために停止しました"、 "アドレス0x1のメモリにアクセスできません"。何が問題なのか知っていますか? – stackunderflow

+0

あなたはそれを最初に尋ねる方がよいかもしれません。混乱しているように聞こえますが、理由を判断するのに十分な情報がありません - この障害が発生した具体的な例がありますか? (また、OS Xの 'gdb'にはいくつかの既知のバグがあります。 – geekosaur

1

デバッグ情報がなければ、それでもデバッグすることは可能ですが、ずっと面倒です。 hereを参照してください。

like meの場合、同じ機能への他の呼び出しをさらに深く掘り下げずに破棄したいだけです。逆アセンブリから取得した関数アドレスにブレークポイントを設定することは難しくありません。disas

関連する問題