Youth 发表于 2008-12-23 14:34:28

[求助] ACE_Message_Block 的 release

代码如下:

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倒是会出问题。

我的用法有问题吗?

winston 发表于 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文件的。

Youth 发表于 2008-12-25 12:19:50

多谢,就是这个问题,我太土了。。。:L

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

[ 本帖最后由 Youth 于 2008-12-25 12:24 编辑 ]

winston 发表于 2008-12-25 12:27:27

ACE的PDB文件和DLL文件放在一起即可。

winston 发表于 2008-12-25 12:28:19

你碰到的这个问题,算是经典问题,典型的字符串越界错误。一般我操作C++字符串,都下意识的多分配1-2个字节来规避(UNICODE)。

Youth 发表于 2008-12-25 13:29:50

回复 #4 winston 的帖子

谢谢,我前面问你的时候也这样试了一下(把ACEd.pdb放到ACEd.dll一个目录),但调试的时候F11(我这里是step into)还是直接就执行过去了,还有什么需要在ide里面设置的吗(vc8)?

winston 发表于 2008-12-25 15:58:10

估计是不匹配的原因,自己仔细对比一下DLL和PDB文件的日期是否一致。IDE输出调试信息的时候,是否说明DLL已经加载了符号。

Youth 发表于 2008-12-26 10:36:59

回复 #7 winston 的帖子

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

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

[ 本帖最后由 Youth 于 2008-12-26 10:38 编辑 ]
页: [1]
查看完整版本: [求助] ACE_Message_Block 的 release