2016-10-09 5 views
1

gdbでは、関数内でデバッグするときに、関数の最後まで実行するために "finish"コマンドを使用できます。gdbは関数呼び出しをどこで終了するかを知るためにどのようなメカニズムを使いますか?

私の質問は、ソースコード "{}"と一致するデバッグシンボルがない場合、gdbは関数の終了位置をどのように知っていますか?

gdbは、機能の終了に達したかどうかを判断するために、x86の下で "leave"または "mov%rbp、%rsp、pop%rbp"のいずれかを探します。

しかし、問題は、(1)ソースコードとABIの構造に応じて、関数呼び出しの開始/終了時に/ポップをプッシュする必要がありますいくつかの余分なレジスタがまだそこにいる、

です。

(2)コンパイル時にプッシュ/ポップする必要があるレジスタの数が決まっていますが、この "number"情報がバイナリ実行ファイルをスローするのではないかと思います。

gdbはどのようにして関数呼び出しの終了点を判断しますか? "finish"コマンドでジャンプできますか?

ありがとうございます!

答えて

3

gdbはマシンコードの解析を試みません。代わりに、スタックを巻き戻し、呼び出し元のPCを見つけて一時的なブレークポイントを設定します。その後、ブレークポイントに達するまで下位ランを実行させます。

gdbのアンワインダーが設計されているため、これはインライン関数からもfinishを自動的に処理します(このためコードにはまだ特殊なケースがいくつかあります)。

関連する問題