今天在调试一个程序的时候出现了一个很奇怪的bug:函数形参的值被篡改,调试程序时的下一步乱跳。
红 {MOD}箭头标记处的整个if片段被跳过,连判断都没有判断一下。形参
_path_index的值在执行完if(XXXCheckBox[_path_index]->GetCheck() == BST_CHECKED)语句之后被篡改了,而且每次篡改的值都不一样(调试了多次),还都是很长的一串数字。
程序段被跳过的原因猜想是:红 {MOD}箭头处if中的子函数里面定义了一个二维静态数组。但是为什么定义了一个静态二维数组之后就无法进入子函数的原因未知。之前定义了一个一维静态数组是能进入子函数的。
关于参数被篡改,可能是因为resource.h文件中的控件ID的参数不合适:
由于需要保证这些控件的宏定义数值是连续的,故而将这些数值重新更改成了如上图所示的值。可能由于这些数据不合理导致控件的内存空间里的值被篡改。至于为什么会怀疑到这儿,是因为我之前将其他控件的ID改了之后,程序运行后直接崩溃。
但是在网上寻找各种关于resource.h和.rc文件的含义和作用也没发现问题所在。
最后根据调试的时候跳步这个现象百度了一下,最后在一个CSDN论坛里找到原因:没有将调试模式改为DEBUG!!!
附上论坛链接:https://bbs.csdn.net/topics/392277592?page=1
我用的调试器是SingleImage,至于为什么会使用了这个调试器,是因为之前打包程序的时候需要用到这个调试器,打包完之后,没有将它换回。由于不是很了解这些调试器的不同之处,所以也没有在意,故而出现了这个很奇怪的bug。
仅仅在修改了调试器之后,便能正常调试程序,函数形参没有被篡改,红 {MOD}箭头处的语句也能正常执行,并不是二维静态数组和控件ID的锅。