2

Andrew Hunt と David Thomas による「 The Pragmatic Programmer 」を読んでいます。95 ページの「デバッグ」というセクションで、著者は次のように書いています。

「小さな整数値が表示されることを期待して、変数を調べて、代わりに 0x6e69614d のような値を取得することがあります。深刻なデバッグのために袖をまくる前に、この破損した変数の周りのメモリを簡単に確認してください。多くの場合、私たちの場合、文字として周囲のメモリを調べると、次のことがわかります。

20333231 6e69614d 2c745320 746f4e0a
  1 2 3   M a i n    St,    \n No t
2c6e776f 2058580a 31323433 00000a33
 o w n ,  \n X X   3 4 2 1  2\n\0\0

誰かが私たちのカウンターに番地をスプレーしたようです。今、私たちはどこを見ればよいかを知っています。」

この例を完全に取得することはできません。

1)この文脈で、著者は「カウンター」で何を意味していますか?

2) 誰かがそこに番地をスプレーした場合、変数に "Main" という値ではなくメモリ アドレスが表示されるのはなぜですか?

3)中毒で、キャラクターとして「記憶の近所」を覗くことができるツールは何ですか?

注意: 値: "Main" が保持されているメモリ アドレス (6e69614d) は、変数 0x6e69614d で見つかったものと同じであることに注意してください。

4

1 に答える 1

2

Counter は、シナリオの開始時に使用した小さな整数値です。

これはメモリアドレスではなく、16 進数です。それはメモリアドレスかもしれませんし、大きな数字かもしれませんし、144th や Main のような数文字のアドレスかもしれません...

ツールに関しては、作業している環境によって異なります。

この種の問題は、特に C のような意図的に緩い言語を使用している場合に、管理されていない環境の開発者を悩ませていたことに注意してください。

必要なのは、どこかで 16 文字の長さとして定義した文字列へのポインタを取ると言う関数だけです。

それに 18 文字を書き込みます。文字列の後の最初の 2 バイトを踏みにじっただけです。

Pascal のようなより厳密な言語や、より近代的なマネージド言語は、代わりに叫び声を上げ始めます。偶然にこれを行うのははるかに難しいという事実に注意してください。また、意図的に行うのもはるかに難しいことを意味します。

于 2013-01-17T09:07:07.780 に答える