web-dev-qa-db-ja.com

gdb:現在の行を印刷する方法、または現在の行番号を見つける方法

listコマンドは一連の行を出力しますが、現在の場所とおそらくエラーが発生した可能性のある場所に1行必要です。

81
Boris Burkov

デバッグ中に同じ情報を取得します。スタックトレースをチェックしている間ではありませんが。おそらく最適化フラグを使用したと思います。これを確認してください link -関連するもの。

-g3でコンパイルしてみて、最適化フラグをすべて削除してください。その後、動作する可能性があります。 HTH!

16
kumar_m_kiran

'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コマンドの詳細については、 こちら をご覧ください。

88
user3162307

Gdbは、低レベルの命令が可能な強力なコマンドであるため、アセンブリの概念に関連付けられていることに注意してください。

あなたが探しているものはde命令ポインタと呼ばれます、すなわち:

命令ポインタレジスタは、プロセッサが次に実行を試みるメモリアドレスを指します。命令ポインタは、16ビットモードではipと呼ばれ、eipでは32ビットモード、および64ビットモードのrip.

詳細 ここ

gdbの実行で利用可能なすべてのレジスタは、次のように表示できます。

(gdb) info registers

それを使用すると、プログラムが実行されているモードを見つけることができます(これらのレジスタが存在するかどうかを確認します)

次に(ここで最も一般的なレジスタripを使用して、最近ではeipに置き換えます)まれにip必要に応じて):

(gdb)info line *$rip

行番号とファイルソースが表示されます

(gdb) list *$rip

その前後のいくつかの行を表示します

しかし、おそらく

(gdb) frame

多くの場合で十分です。

16
albfan

コマンドwhereまたはframeを使用できます。ここで、コマンドは関数名の詳細情報を提供します

14
pravu pp

上記の答えはすべて正しいです。私が好むのは、ユーザーにとって非常に役立つ別のウィンドウに位置と機能を表示するtuiモード(ctrl + X A)を使用することです。それも役に立てば幸いです。

1
Mazhar MIK