8

私が書いたプログラムをデバッグしようとしています。デバッガによると、特定void *の値は 0x804b008 です。この値を逆参照できるようにしたいと思います(キャストして値int *を取得します)。

このコードでセグメンテーション エラーが発生します。(プログラムvoid *はまだバックグラウンドで実行されています-「一時停止」しています)

#include <stdio.h>

int main() {
    int* pVal = (int *)0x804b008;
    printf("%d", *pVal);
}

メモリ内の任意のポイントを参照できることが危険である理由がわかるので、これが機能していない可能性があります。

ありがとうございました!

4

2 に答える 2

7

あなたのプログラム (デバッガーで実行されている) とこれは、同じ仮想メモリ空​​間で実行されません。そのポインターにアクセスしても (有効なポインターであっても)、情報は得られません。

マシン上で実行されているすべてのプログラムには、独自の論理アドレス空間があります。オペレーティング システム、プログラミング言語のランタイム、およびその他の要因は、特定のプログラムのポインターとして使用される実際のリテラル値に影響を与える可能性があります。しかし、あるプログラムが別のプログラムのメモリ空間を見ることは絶対にできません。もちろん、この動作をサポートするためにいくつかの特別なトリックを実行するソフトウェア デバッガを除きます。

いずれにせよ、デバッガーは、プログラムが一時停止している間、必要なメモリを表示できるようにする必要があります-有効なアドレスがあると仮定します。gdb ではx/x 0x804b008、見たいものを取得できます。

詳細については:

  1. 仮想メモリに関するウィキペディアの記事。
  2. gdbドキュメンテーション
于 2010-02-16T05:13:19.397 に答える
0

とても簡単です。OS は、アドレスがプログラムに属していないことを認識しているため、メモリ保護をバイパスせずに印刷することはできません。

于 2010-02-16T05:14:35.510 に答える