这两天在调试程序时,碰到了一系列非常奇怪的问题,把它写出来与大家分享。
一、地狱中迷失
事情起因是这样的,我用gdb调试时打完断点后,程序并没有停在该断点,而是停在其它地方,比如:我在某文件的1000行处打了一断点,程序却停在1050行,按照以前的经验,一般出现该问题有如下两种原因:一是调试机的源文件没有更新,或者调试机与开发编缉所在的机器系统日期不一致,即后者比前者要早一些,但即使这样,若执行了make clear也不用出问题;二是编绎时加了-O优化选项,导致调试显示的代码与实际源码可能不一致;呵,我原本想一笑而过,小试牛刀一把,不想实际并非如此,用这两种方法均无济于事。
之后一系列奇怪的事发生了,先是gdb显示的行数与程序实际执行的行数是不匹配的,(这有实验为证:如有一变量是在1200行赋了值,但gdb显示到此处时该变量显示的是一乱码),接着gdb显示的代码越发离谱,比如:它显示了return false,但程序依然顺序往下执行... ...
二、炼狱中挣扎
此时此刻,我发觉的确有点晕了,为了赶进度,不想困在原地,于是赶紧上常去的BBS,那里大侠云集,希望能快点碰到高人指点,但贴子发出去后,得到的答复大多跟我上面提的两个方法一样,看来我没有其他哪般幸运,仅用上面两招就能KO敌手,继续查看DEBUG信息,也继续郁闷... ...
无奈之下,想到RTX上不还有兄弟部门的众多高手在线上挂着吗?于是迅速找到QQGame和QQPet的主程及平台研发部的几位兄弟一起探讨,热心的兄弟总是多于“装酷”的兄弟的,但是研究讨论了半天还是未果... ...
时间不等人,我索性不用单步调试了,尽量多仔细源码,保证程序逻辑的正确性,只要编译OK了,统计运行结果就得无误,有趣的是,我直接运行程序,程序居然能按正确的逻辑得到正确的结果,这让我有点瞠目结舌了... ...
三、天堂里重生
进度虽然赶上了,但这个问题就如同卡在喉咙里的一根刺,不吐不快啊!而就在这时,一个意外发现,让我终于知道了问题的症结所在。那是我在编绎某个文件时,发现编译报错的行数,居然也跟源文件所在的行数不一致,这让我不得不再次细细地查看源文件,看了几遍没发现什么异常,正当再次陷入山穷水尽之际,一个画面映入我的眼帘.
大家可以看到一个清晰的^M符号,其实,这个^M符号也不是什么新朋友,因为之前我也碰到过,之所以产生这个符号,是由于我在windows下用Source Insight进行编辑,再用rz命令上传至开发机编译和调试,在这个过程中,windows下的一些符号在linux下转换时出现混乱导致的,有鉴于此,我在windows下编缉时都是特别注意一些符号使用的,让我不曾想到的是,居然它会出现在注释处。
唉,长叹一声后,赶紧将其全部替换,三下两除二之后,问题终于Kill掉了!
至此,郁闷了大半天的问题终于告一段落,^M这个熟悉的陌生人让我再次多吃了一次哑巴亏,哎,早知今日之痛苦,为何当初就不多检查一下源码呢?
呵,只是困顿的心情终于得以舒展,就如同置身天堂之上,妙处难与君说啊!