腐败变量?将周围的内存检查为字符

时间:2013-01-17 08:36:10

标签: debugging memory-management

我正在读安德鲁·亨特和大卫·托马斯的“The Pragmatic Programmer”。 在第95页,在名为“Debugging”的部分中,作者写道:

  

“有时你会检查一个变量,期望看到一个小整数   值,而是得到像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

1 个答案:

答案 0 :(得分:2)

计数器是他们启动场景的小整数值。

这不是一个内存地址,它是一个十六进制的数字。它可能是内存地址,它可能是一个很大的数字,它可能是地址的第几个字符,如144和Main ...

至于工具,取决于你正在工作的环境。

您应该注意到,这类问题困扰着非托管环境中的开发人员,尤其是在使用C等故意松散的语言时

你需要的只是一个函数,它指的是一个指向字符串的指针,在某个地方你定义为16个字符长。

写入18个字符,你只是践踏了字符串之后的前两个字节。

像Pascal这样的更严格的语言,或者更现代的管理语言,会开始尖叫并向你大喊大叫。 请注意,事故发生这种情况要困难得多,这也意味着它更难以故意这样做,因此更现代化并不能自动转化为更好。