找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4789|回复: 4

Release 版本下 proactor 发生异常

[复制链接]
发表于 2008-7-15 22:57:18 | 显示全部楼层 |阅读模式
如题,我在DEBUG版本下用的好好的,但在RELEASE版本下,退出时就会发生异常,调试跟踪发现在这一行发生的:
int
ACE_WIN32_Asynch_Result::post_completion (ACE_Proactor_Impl *proactor)
{
  // Get to the platform specific implementation.
  ACE_WIN32_Proactor *win32_proactor = dynamic_cast<ACE_WIN32_Proactor *> (proactor);
  if (win32_proactor == 0)
    ACE_ERROR_RETURN ((LM_ERROR,
                       ACE_LIB_TEXT ("Dynamic cast to WIN32 Proactor failed\n")),
                      -1);
  // Post myself.
  return win32_proactor->post_completion (this);
}
各位,有碰到过问题吗,怎么解决的,我在网上搜不到!
 楼主| 发表于 2008-7-15 22:57:56 | 显示全部楼层
我碰到过的。
是你退出的时候,处理顺序不对,主线程退出了,但是其它线程还在跑,导致结果返回的时候,造成错误。
还有一种情况,就是内存错误 - debug下,因为有保护字节,所以不表现出来,release下很容易出现。再者,看看是否有未保护的全局变量。
 楼主| 发表于 2008-7-15 22:58:03 | 显示全部楼层
武断一点说,凡事ace内部报错的,几乎都是用户自己写的代码有问题导致的.

我不小心多次犯过这样的错误,小列几个: 

1. 构造ACE_Message_Block的时候,错误的指定了大小

2.   wr_ptr(len)或rd_ptr(len)时,错误的计算了长度

3.  链接其它库的时候,错误的加载了版本

4.  实例化一个对象或结构的时候,没有调用正确的构造函数进行初始化

5.  重载或模版参数实例化时,错误的设置了基类或参数不清

常常,大问题都是小错误引起的,养成好的编码风格和编码心态才能尽量少犯错误.
 楼主| 发表于 2008-7-15 22:58:09 | 显示全部楼层
我也知道肯定是自已的问题,因为在网上发现别人好像都没有遇到此问题!

但我对两种版本下都一一跟踪过,就是到动态转化时出错,找了一下午,还是没有找到原因,郁闷中。。。
 楼主| 发表于 2008-7-15 22:58:22 | 显示全部楼层
问题终于得解:

因为在 ACE 库中使用了大量的 dynamic_cast,而此机制需要“运行时类型信息 RTTI”的支持,在 ACE 的工程配置中此选项是被选中的,但VC开发环境的默认配置是禁止此项的(打开此项会影响程序的效率)。有意思的是我的 DEBUG 版本不知什么时候选中了此项,但由于 RELEASE 是默认的设置,导致了此问题的产生。

希望大家注意:以后的程序只要用到 ACE 库时都要设置此选项!
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

Archiver|手机版|小黑屋|ACE Developer ( 京ICP备06055248号 )

GMT+8, 2024-11-21 21:24 , Processed in 0.018488 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表