3

「Learn C The Hard Way」の例を作成しているときに、次のように考えました。

int a = 10 に設定しました。しかし、その値 10 は実際にはどこにあるのでしょうか? プログラムの実行中に外部から手動でアクセスできますか?

デモンストレーション用の小さな C コード スニペットを次に示します。

int main (int argc, char const* argv[]) {                                   

    int a = 10;
    int b = 5;
    int c = a + b;

    return 0;
}   

The GNU Project Debugger (GDB)を開いて、次のように入力しました。

break main
run
next 2

私が理解したことから、0x7fff5bffb04はのメモリアドレスですint c。次に、hexdump -C /dev/memシステム コールを使用して、メモリ全体を端末にダンプしました。

問題は、この大量の 16 進ダンプのどこで変数 cを探すかということです。私の希望は、アドレスが与えられると、0x7fff5bffb04その値を見つけることができることです15。また、おまけの質問です。hexdump -Cの各列は何を表していますか? (最後の列がASCII表現であることは知っています)

gdb

16進ダンプ

4

2 に答える 2

3

次に、hexdump -C / dev / memシステムコールを使用して、メモリ全体をターミナルにダンプしました。

hexdumpが物理メモリアドレスをダンプしました。アドレス0x7fff5bffb04は、デバッグしているプロセス内の変数の仮想アドレスです。いくつかの物理アドレスにマップされていますが、カーネルマッピングテーブルを調べないと、どれを見つけることができません(Matがコメントですでに言っているように)。

仮想アドレス空間を調べるには、を使用します/proc/<pid>/mem(Barmarがコメントですでに述べているように)。

ただし、この演習全体は無意味です。これは、GDBの仮想メモリをすでに調べることができ、GDBがまだあまり便利に表示していない仮想メモリを見ると何も表示されないためです[1]。

[1] GDBによって挿入されたブレークポイントを見ることができたが、それを理解することは期待されていないことを除いて:-)

于 2012-09-15T23:36:40.337 に答える
1

まず、値が ram に存在する理由さえありません。このプログラムのマシンコードは、単に cpu レジスタに値を持っているだけではありません。より多くのバイトを用意し (少なくとも 512 を試してください)、それらをランダムな値に設定する必要があります。これをメモリ ダンプで検索できます。

C コンパイラによって生成されたアセンブリ コードを見た方がはるかに優れています。

于 2012-09-15T10:42:36.983 に答える