回答:
デバッグ中にも同じ情報が得られます。スタックトレースをチェックしている間ではありませんが。おそらくあなたは私が思う最適化フラグを使用したでしょう。このリンクをチェックしてください -何か関連しています。
-g3
最適化フラグを削除してコンパイルしてみてください。その後、うまくいくかもしれません。HTH!
-g
デバッグ情報を含むようにコンパイルされましたが、私は現在スタックフレームにあり、共有ライブラリの1つから取得されました。ありがとう、クマー。
「フレーム」コマンドはあなたが探しているものを提供します。(これは単に「f」と省略できます)。次に例を示します。
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
引数がない場合、「フレーム」は現在の位置を示すだけです(引数を指定すると、フレームが変更されます)。frameコマンドの詳細については、こちらを参照してください。
gdbは強力なコマンドであり、低レベルの命令が可能であるため、アセンブリの概念に関連付けられていることに注意してください。
あなたが探しているものは、命令ポインタと呼ばれています、すなわち:
命令ポインタレジスタは、プロセッサが次に実行しようとするメモリアドレスを指します。命令ポインタが呼び出され、IP、16ビットモードでEIP 32ビットモードで、及びリップ 64ビットモードです。
詳細はこちら
gdbの実行で利用可能なすべてのレジスタは、次のように表示できます。
(gdb) info registers
これを使用すると、プログラムが実行しているモードを見つけることができます(これらのレジスタのどれが存在するかを確認します)。
次に(ここでは、現在最も一般的なレジスタリップを使用し、必要に応じてeipまたは非常にまれにipに置き換えます):
(gdb)info line *$rip
行番号とファイルソースを表示します
(gdb) list *$rip
その前後にいくつかの行を表示します
しかし、おそらく
(gdb) frame
多くの場合、これで十分です。
ip
では使用されません。また、プログラムカウンターの名前を明示的にスペルする代わりに、GDBのエイリアスを使用できます$pc
。だから、x/10i $pc
アーキテクチャに関係なく、現在の命令ポインタで10個の手順を逆アセンブルします-それはi386で動作します、x86_64版、ARMなど。
backtrace
またはwhere
、さらにinfo line
または単にbt
(バックトレースの場合)。 dirac.org/linux/gdb、gdbチュートリアル