slugzoe
发表于 2009-12-1 00:32:02
万分感谢各位版主大大们的赐教,诚如wishel版主所言,打trace是最快捷的途径,我这边用gdb打印出来了错误处
0x001d7526 in ACE_Message_Block::total_size_and_length (this=0xb7f73a98, mb_size=@0xb5a6ff4c,
mb_length=@0xb5a6ff48) at Message_Block.cpp:267
267 mb_size += i->size ();
(gdb) print i
$1 = (const ACE_Message_Block *) 0xb7f73a98
(gdb) print *i
$2 = {_vptr.ACE_Message_Block = 0xb7f73af8, rd_ptr_ = 0, wr_ptr_ = 7, priority_ = 0,
cont_ = 0x0, next_ = 0x0, prev_ = 0x0, flags_ = 0, data_block_ = 0x0,
message_block_allocator_ = 0x9fd9558}
其实可以看到i已经不存在了,我会尝试打印size的大小,不过就现在的流量而言顶棚了不到5K,很难想象会是带宽问题,很可能只是数据传的太快,我会仔细地再看看,我这边代码比较分散,不是很方便传,如果实在搞不出来,希望大大们可以远程协助下我
winston
发表于 2009-12-1 09:58:38
帖关键代码就成,把涉及业务、隐私的东西删除即可。
有代码才好判断问题,不然都是评经验瞎猜。
slugzoe
发表于 2009-12-8 10:07:35
实在不行了,尝试了半天还是没找到原因,这里把gateway整个代码附上.希望各位大大帮忙解释一下
slugzoe
发表于 2009-12-8 10:07:57
代码写的很丑,大家不要笑哈
lilinfeng124
发表于 2009-12-11 10:52:32
本人也遇到类似问题。本人使用了ACE的线程池,用一个MANAGER管理分发MESSAGE_BLOCK,多个worker做分线程负责处理。每个worker去getq取消息包的时候发生了问题,发现处理速度快的时候塞进去一个包,有时候getq取出来好几个重复的包。开始也不相信,现在用自己的东西代替了getq函数,发现问题就解决了。还有ACE下得消息队列也是同样的问题,只要处理速度一快,塞进去一个包,取出来好几个重复的包!不知何故,请求高手指点!
slugzoe
发表于 2010-1-3 22:50:36
问题还没有解决,版主大大们忘了么=。=
wishel
发表于 2010-1-4 10:45:44
楼主不好意思啊,最近非常忙。代码没时间看。。。
建议换个环境试试看,先排除环境的问题。
前两天有个朋友也让我看一个奇怪的问题,但在我机器上运行的好好的。