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


94

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


23
backtraceまたはwhere、さらにinfo lineまたは単にbt(バックトレースの場合)。 dirac.org/linux/gdb、gdbチュートリアル
dwalter

btまたはbacktraceまたはwhere関数呼び出しのスタックを印刷する、fまたはframe実行するために次の行を印刷します。
Eric Wang

回答:


21

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

-g3最適化フラグを削除してコンパイルしてみてください。その後、うまくいくかもしれません。HTH!


1
ああ、それで私のプログラムは-gデバッグ情報を含むようにコンパイルされましたが、私は現在スタックフレームにあり、共有ライブラリの1つから取得されました。ありがとう、クマー。
Boris Burkov 2013年

104

「フレーム」コマンドはあなたが探しているものを提供します。(これは単に「f」と省略できます)。次に例を示します。

(gdb) frame
\#0  zmq::xsub_t::xrecv (this=0x617180, msg_=0x7ffff00008e0) at xsub.cpp:139
139         int rc = fq.recv (msg_);
(gdb)

引数がない場合、「フレーム」は現在の位置を示すだけです(引数を指定すると、フレームが変更されます)。frameコマンドの詳細については、こちらを参照してください


21

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

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

命令ポインタレジスタは、プロセッサが次に実行しようとするメモリアドレスを指します。命令ポインタが呼び出され、IP、16ビットモードでEIP 32ビットモードで、及びリップ 64ビットモードです。

詳細はこちら

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

(gdb) info registers

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

次に(ここでは、現在最も一般的なレジスタリップを使用し、必要に応じてeipまたは非常にまれにipに置き換えます):

(gdb)info line *$rip

行番号とファイルソースを表示します

(gdb) list *$rip

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

しかし、おそらく

(gdb) frame

多くの場合、これで十分です。


2
GDBは16ビットモードをサポートしていないため、ここipでは使用されません。また、プログラムカウンターの名前を明示的にスペルする代わりに、GDBのエイリアスを使用できます$pc。だから、x/10i $pcアーキテクチャに関係なく、現在の命令ポインタで10個の手順を逆アセンブルします-それはi386で動作します、x86_64版、ARMなど。
ルスラン

18

コマンドは、どこのフレームを使用することができます。コマンドは関数名でより多くの情報を提供します


2

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.