直接进入正题。请问下面这段代码,会修改 arry2 的内容码?(或则这么说,写程序的人本意是想修改 arry1 的内容,他能达到自己的目的吗?)
很明显,当我们仿真程序的时候发现,
以上这段代码意外的修改了 arry2 中的内容。这在编码一些大型程序的时候就会导致很多意想不到的结果,比较好的情况下只是程序运行逻辑不正常。但是一旦修改到其他重要的内存空间,比如函数指针之类的地方,可能就会导致程序死机。
这种简单的程序一旦出现问题,我们很容易分析,哦,是指针使用越界导致了内存的意外篡改。但是,一旦等到程序的体量比较大,光想靠分析程序逻辑来确认到底是哪里意外篡改内存这几乎是不太可能的情况。今天我就准备分享一个比较实用的小技巧。请在调试界面按下:Ctrl + B。至于这是什么东西,可以自行百度 keil 的 breakpoint 功能。它就能我们今天的主角。暂且命名为:变量定位器。它能在变量被修改或则读取的时候停下来。我们就使用这种简单的功能就可以了。
-
想要观察的变量
-
是否监测被读位置?
-
是否监测被写位置?也就是我们意外篡改的地方
-
这里一般选择 Object 就可以了。
其他地方暂时就不需要知道了。好了,有了这样的工具,我们如何确定上面例子中 arry2 的内容是在何处被意外修改的?当你知道 arry2 的内容肯定不是你自己修改的时候,我们在 breakpoint 中填入一下信息:
然后点击 define 然后就得到了如下的内容。
这就相当于我们告诉 keil 调试器,我们需要在 arry2 被 write 的时候自己停下来。关闭 breakpoint 窗口点击运行。
你会发现,就算你没有打断点,但是程序也会莫名其妙的停在了第九行。这是为什么呢?因为第8行修改了 arry2 的内容。这也就符合我之前的预期。无论哪里修改 arry2 的内容,程序都会停下来。是不是很实用?对于内存的意外篡改调试有很大的帮助。