用VC写程序的时候常常会遇到只在Release Build中才会出现的问题,由于这样的问题在Debug Build中不会出现,因此无法在Debug Build中调试。记得以前在CSDN的VC论坛中常常有人问这样的问题,大家好像也总结了不少,只是时间久了,记不太清楚了
。只有一条印象非常深刻,就是自定义消息的响应函数的返回值一定得是LRESULT,如果是其他类型,比如void,在Debug下没问题,在Release下就有可能引起崩溃。之所以印象深刻,是由于我在这个上面吃过大亏![]()
Fixing Release Build Problems介绍了一些诊断和调试Release Build的方法,但是似乎没提到我说的这一条![]()
打印 | 张贴于 2003-11-05 16:32:00 | Tag:工作
留言反馈
我的Release的服务遇到并发多的时候,容易意外崩溃。
你猜怎么回事?
原因可能是7月3日~7月24日之间,我神差鬼使地把service的Release MiniDependency编译模式下的运行时库从“Multithreaded”设置到了“Single-threaded”,而自己又没有注意到。可能是鼠标的滚轮随便滚了一下。
从而开始了漫长之久的调试之旅。当然总会找出程序的代码上一些其他毛病。然而,虽然在公司测试环境Debug模式一直稳定工作,但是Release到生产环境就总要一天意外崩溃一次。想了许久运行机理,都没有找到原因。
最后,终于按照BounsChecker的警告,把创建线程的方式从“CreateThread”变为“_beginthreadex”,重新编译之下,突然发现STLPort要去连编stlport_vc6_static.lib,而正常地应该是去连stlport_vc6.lib。这时候才发现运行时库一直编译错为“Single-threaded”了。
这样的后果,我猜想会造成线程之间不安全,数据易遭到破坏,这时候通常会有多个工作线程同时从线程池中醒来。请求频率低的时候,I/O 完成端口只会一再地唤醒同一个线程,所以不会涉及线程安全。当几十个请求一起抵达时,I/O完成端口唤醒了多个工作线程并行处理,这时候单线程的运行时库就有可能给service带来了致命一击。
要不是我改变了创建线程的方式,我根本不会想起来自己的服务用的是什么运行时库。呜呼!
哪位有关于Fixing Release Build Problems方面的经验,可以在这里share一下:)