最近遇到一个问题:代码同同样是调用一个前期测试通过的函数,此次又统一调用了十次,有两次是调用是不成功的。
debug进去之后发现指向的是当前函数,跳转进去之后参数值是下一此调用的参数值,加message弹框阻断又是可以的。简直是灵异。
查阅网上代码,发现了一个看着很有用的信息:
eclipse或vs在c++调试断点乱跳错位问题笔记
https://blog.youkuaiyun.com/gubenpeiyuan/article/details/50955660
总结:删掉所有临时文件和输出文件,重编工程;不行再用UltraEdit打开出问题的文件,另存为ANSI编码、换行回车选择Unix 0x0A方式后,检查是否有乱码或者换行不对,应该都能解决。
问题如下:
1.错误代码报错行数错位
2.debug动态跟踪错位
3.Release跟踪错位
4.断点设置自动被跳转
可能的原因有三种:
第一:
代码和dll或者exe不一致;
第二:
数组等越界导致内存乱了;
第三:
0D0A 改为了0D少了0A或者中文注释打乱了VS对0D0A的定位
方法一:
最方便的方法是静态编译看看是不是第三个原因,
首先VS的option里面把line number勾选出来,这样可以看到每行代码的行数,在断点错位的那行代码里面人为的添加几个语法错误,
然后编译,看看报错的代码行数是不是已经错位了,如果已经错位了,就是第三种情况,可以拿UE或者直接把中文注释全部删掉,
慢慢排查看看哪行换行符出了问题,简便办法是在随机的代码行里面人为添加语法错误,来逐步定位哪里几行的问题。
方法二:
1.挨个设断点,终于找到了首错位地址,呵呵,进步.
2.偶怀疑是注释造成的问题,去掉全部的注释,再DEBUG,靠,还错位...
3.把开始出问题的代码全部都注释吧...靠,还错位...
4.这是什么问题,快疯掉了...
5.把出问题的代码全部删除,咦,正常了..
6.看来问题就出在被删除的代码上,不过看起来,代码一切正常啊,怎么会出问题呢?
7.拿出UE来,看看代码中是否有非法字符(用十六进制的方式看)
8.问题被看出来了,一般的代码与代码之间的换行是 0x0d 0x0a, 而这段代码中却有几行代码是 0x0d 没有0x0a...
到现在,我还没试出来怎样的情况下没有0x0a
9.去掉0x0d,重新在IDE中"回车"
10.再Debug,一切正常
里面提到所示编码的问题,猜想是不是这个原因。于是安装notepad++的hex-Edidtor插件,利用插件查看怀疑行的代码16进制,发现注释处的中文字符是乱码!!怀疑是注释编码的问题,删掉注释时候重新编译,结果函数就执行无误了。
后来通过对比发现是出错的注释那句编码结束之后多了一个“09”,不知道怎么多的。