list
コマンドは一連の行を出力しますが、現在の場所とおそらくエラーが発生した可能性のある場所に1行必要です。
デバッグ中に同じ情報を取得します。スタックトレースをチェックしている間ではありませんが。おそらく最適化フラグを使用したと思います。これを確認してください link -関連するもの。
-g3
でコンパイルしてみて、最適化フラグをすべて削除してください。その後、動作する可能性があります。 HTH!
'frame'コマンドは、あなたが探しているものを提供します。 (これは単に「f」と省略できます)。以下に例を示します。
(gdb) frame
\#0 zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139 int rc = fq.recv (msg_);
(gdb)
引数がない場合、「frame」は現在の位置を示します(引数があるとフレームが変更されます)。 frameコマンドの詳細については、 こちら をご覧ください。
Gdbは、低レベルの命令が可能な強力なコマンドであるため、アセンブリの概念に関連付けられていることに注意してください。
あなたが探しているものはde命令ポインタと呼ばれます、すなわち:
命令ポインタレジスタは、プロセッサが次に実行を試みるメモリアドレスを指します。命令ポインタは、16ビットモードではipと呼ばれ、eipでは32ビットモード、および64ビットモードのrip.
詳細 ここ
gdbの実行で利用可能なすべてのレジスタは、次のように表示できます。
(gdb) info registers
それを使用すると、プログラムが実行されているモードを見つけることができます(これらのレジスタが存在するかどうかを確認します)
次に(ここで最も一般的なレジスタripを使用して、最近ではeipに置き換えます)まれにip必要に応じて):
(gdb)info line *$rip
行番号とファイルソースが表示されます
(gdb) list *$rip
その前後のいくつかの行を表示します
しかし、おそらく
(gdb) frame
多くの場合で十分です。
コマンドwhereまたはframeを使用できます。ここで、コマンドは関数名の詳細情報を提供します
上記の答えはすべて正しいです。私が好むのは、ユーザーにとって非常に役立つ別のウィンドウに位置と機能を表示するtuiモード(ctrl + X A)を使用することです。それも役に立てば幸いです。