找回密码
 用户注册

QQ登录

只需一步,快速开始

查看: 4496|回复: 7

[求助] ACE_Message_Block 的 release

[复制链接]
发表于 2008-12-23 14:34:28 | 显示全部楼层 |阅读模式
代码如下:

ACE_Message_Block *mb = NULL;
size_t cntToSend = 4 + sData.length() + 2;
ACE_NEW_RETURN(mb, ACE_Message_Block(cntToSend), -1);
ACE_OS::sprintf(mb->wr_ptr(), "%04d%s\r\n", res, sData.c_str());
mb->wr_ptr(cntToSend);

ssize_t cntSent = this->peer().send(mb->rd_ptr(), cntToSend);

if (cntSent == cntToSend)
{
  mb->release();
  return 0;
}

...

我用的VC2005,sData是传入的一个std::string变量。

现在的问题是Debug的时候mb->release()出错,还跟踪不进去,而Release的时候都正常,没有mb->release倒是会出问题。

我的用法有问题吗?
发表于 2008-12-24 22:14:19 | 显示全部楼层
ACE_NEW_RETURN(mb, ACE_Message_Block(cntToSend), -1); //分配小了,少了一个字节
ACE_OS::sprintf(mb->wr_ptr(), "%04d%s\r\n", res, sData.c_str());//结尾\0自动跑过边界
你把分配的空间搞大点试试。

不能进入调试是你自己程序的问题,需要PDB文件的。
 楼主| 发表于 2008-12-25 12:19:50 | 显示全部楼层
多谢,就是这个问题,我太土了。。。:L

另外,求教一下PDB文件怎么用?我的ACE是编译成DLL的,如果想在调试的时候跟踪到ACE的代码内,大致上应该如何操作&设置?

[ 本帖最后由 Youth 于 2008-12-25 12:24 编辑 ]
发表于 2008-12-25 12:27:27 | 显示全部楼层
ACE的PDB文件和DLL文件放在一起即可。
发表于 2008-12-25 12:28:19 | 显示全部楼层
你碰到的这个问题,算是经典问题,典型的字符串越界错误。一般我操作C++字符串,都下意识的多分配1-2个字节来规避(UNICODE)。
 楼主| 发表于 2008-12-25 13:29:50 | 显示全部楼层

回复 #4 winston 的帖子

谢谢,我前面问你的时候也这样试了一下(把ACEd.pdb放到ACEd.dll一个目录),但调试的时候F11(我这里是step into)还是直接就执行过去了,还有什么需要在ide里面设置的吗(vc8)?
发表于 2008-12-25 15:58:10 | 显示全部楼层
估计是不匹配的原因,自己仔细对比一下DLL和PDB文件的日期是否一致。IDE输出调试信息的时候,是否说明DLL已经加载了符号。
 楼主| 发表于 2008-12-26 10:36:59 | 显示全部楼层

回复 #7 winston 的帖子

版主强。。。果然是这个问题,我的pdb是从同一台机器上拷贝过来的,但debug目录下那个dll已经记不清是哪里来的了,日期比这台机器上的要新,文件也小。。。:L

终于知道output里面的No symbols loaded指的是啥了,呵呵,谢谢winston!

[ 本帖最后由 Youth 于 2008-12-26 10:38 编辑 ]
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

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

GMT+8, 2024-12-23 21:48 , Processed in 0.071969 second(s), 6 queries , Redis On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

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