Debugging 腐败的变量?以字符形式检查周围的内存

Debugging 腐败的变量?以字符形式检查周围的内存,debugging,memory-management,Debugging,Memory Management,我正在读安德鲁·亨特和大卫·托马斯写的。 在第95页“调试”一节中,作者写道: “有时您会检查一个变量,希望看到一个小整数 值,并在卷取之前获取类似0x6e69614d的值 为了进行一些认真的调试,请快速查看 关于这个损坏变量的内存。通常它会给你一个线索。 在我们的例子中,以字符的形式检查周围的记忆会告诉我们: 20333231 6e69614d 2c745320 746f4e0a 1 2 3 M a i n St, \n No t 2c6e776f 2058580a 313

我正在读安德鲁·亨特和大卫·托马斯写的。 在第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) 在《上瘾》一书中,我还想问一下,哪些工具可以让你把“记忆邻居”作为角色来看待


注意:请注意,内存地址(6e69614d)中的值“Main”与我们在变量中找到的值相同:0x6e69614d

计数器是启动场景时使用的小整数值

这不是内存地址,而是十六进制数。它可以是内存地址,也可以是一个大数字,也可以是地址的几个字符,如144和Main

至于工具,则取决于您工作的环境

您应该注意到,这种问题困扰着非托管环境中的开发人员,特别是在使用像C这样的故意松散的语言时

您所需要的只是一个函数,该函数接受一个指向字符串的指针,在您定义为16个字符长的地方

给它写18个字符,你只是踩了字符串后面的前两个字节

更严格的语言,比如Pascal,或者更现代的管理语言,会开始对你大喊大叫。
请注意这样一个事实,即无意中这样做要困难得多,也意味着故意这样做要困难得多,所以更现代并不能自动转化为更好。

对不起,我还是不明白。在场景中,他们在变量中找到值:“0x6e69614d”。这被解释为一个内存地址,事实上它们在这个地址的周围寻找。特别是在地址“6e69614d”(变量所持有的值)处,它们会找到值:“Main”。为什么要故意使缓冲区溢出?(除了非法原因)路易吉姆萨加莱诺。我能看到的唯一能把它解释为记忆地址的人就是你。它是一些十六进制内存的内容。如果yiu将它传递给一个需要地址的函数,那么它将被用作一个地址。不管是不是。@just.other.programmer。地址是一个16个字符,1个单词的结构,您希望用0填充它。你是一个c程序员,在c中做的聪明的事情就是故意超越它。当然,然后你改变结构,在开头插入字节。你好,巴格先生。@TonyHopkinson好的,你说得对。我认为示例中的表示是一段内存,但这是不可能的,因为地址不是连续的,这没有意义。事实上,我检查过,Ascii中的6e69614d是“Main”。谢谢你的回答。我会接受的。