2017-07-31 10 views
1

私が理解しているように、プログラム内の各関数シンボルには、アドレス空間に対応するメモリ範囲があります。 callアセンブリ命令は、ipとスタック上の他の情報をプッシュし、その範囲の先頭にジャンプします。GDBを使用して関数のメモリ範囲を取得する方法

GDBでデバッグ中にその範囲を取得する必要があります。私は簡単にinfo symbolを使用して、与えられたアドレスまたは行に対応する関数の名前を得ることができます。私は逆:シンボル - >アドレス範囲が必要です。実際、TUIモードを使用してアセンブリコードをスクロールして関数の最後までスクロールし、最後の命令の近くの "<symbol_name> + <offset>"アノテーションを見ても、それは正しい方法ではありません(それはもっと悪いGDB/MIを使用しています)。

GDBを使用してシンボルをそのメモリ範囲に一致させるにはどうすればよいですか?

答えて

0

私が理解しているように、プログラム内の各機能シンボルについては、アドレス空間に対応するメモリ範囲があります。

  1. コンパイラ:

所与の「ソース」機能は、リンクされたELFイメージ内の0(場合に関数が呼び出されないとリンカーをごみは、収集ん)以上のアドレス範囲を占めることができます関数を複数の部分に分割することは自由であり、それぞれが独自のアドレス範囲を持ち、リンカーはこれらの部分を互いに隣り合わせに置く義務はありません。 GCCはそうするためにこれを行います。 TLBのフラッシュを最小限に抑えるために、 の頻繁に実行される部分をfoofoo.hotセクション)にし、頻繁に実行される部分(foo.coldセクション)を別のページに保存してください。

  • 逆も可能:fooがパラメータの固定値で頻繁に呼び出される場合、GCCは関数(foo.clone.123)のコピーを作成し、この値のコピーを最適化します。私はGDBを使用して、そのメモリ範囲にシンボルを一致させることができますどのように

  • print &fooの範囲を見つけるには、

    GDBの範囲の終わりを見つける方法はありません(すでに発見したdisasコマンドのほかに)。 ELFプラットフォームでは、関数の長さを簡単に見つけることができます。 readelf -Ws | grep foo

    関連する問題