www.Walzer.cn - Tech & Management Blog

Focus on mobile dev
本博客文章,未在标题中写明转载的, 均为原创.
所谓高手,也就是熟悉别人制定的游戏规则、并且能在规则内跳舞的人。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 今天我被EVC小小地戏弄了一下, 真TMD小白啊.  我把前人留下的一个功能模块整个目录拷到新项目的文件夹里, 打算改改接口直接拿来用了.  里面代码改好后,调试时候一进到wma.dll的函数里就傻眼了。比如下面两句在Init函数中出现的

static int Init(haha * p)
{
   ohyeah* s = NULL;
    s = Wahaha(&p->heihei, sizeof(heihei_struct));

在调用Init函数之前,那个输入的形参P是好的,一进到函数里调试界面就告诉我没P这个东西。往下走一步,声明S后它仍然不是东西,再走一步,S仍然是未声明状态,连NULL都不是。但在第三行按F11进去看看,居然还正确调用了。再往下多走几步,跳行执行,所有变量都不可观察,头昏。我也梦望自己可以是那种一口气写下几千行代码直接编译通过执行通过没有BUG的超人,  显然这是不可能的。代码不能调试等于直接宣判死刑.

和其他项目的工程文件比较了下,结果是这里导致的:

Project Settings -> C/C++ 页 -> Optimizations 下拉列表。 当要DEBUG时这里必须选择Disable (Debug)。而我COPY过来的时候这里在DEBUG和RELEASE里都设置成Maximize Speed了。

主要是找到这个点上花了些时间,看到是这里后就恍然大悟了。原理说来也很简单,在编译代码时会先根据C生成中规中矩的汇编,这可以在C代码里用从右键菜单的Go To Disassembly来看到。这也就是Diable Optimizations的效果。如果选择了优化,那么编译器会按照一定的算法对这些汇编代码进行优化,那么优化后的汇编和编译前的C代码就不是严格的对应关系了,在DEBUG时就是(1)什么变量都WATCH不了 (2)执行时跳行 的现象了. 以上这段原因是我乱吹的,依稀记得有看过什么资料这样说过, 具体哪篇的找不到了.