本人有一程序,用于播放实时图像和历史回放,实时图像没问题,有问题的是历史图像(debug下正常,release不正常):主要差别为:实时播放时,系统发过来的图像信息前有6个字节的信息头,回放存储的文件是没有这6个信息头的,于是我在读回放文件时,人为加了6个字节的头:
此段程序用于从文件中读取数据,放入对应buffer中:
  f = fopen(fileN, "rb" );
if (f==NULL) 
    {
       return 0;
}
fseek(f, current_size, SEEK_SET); if (fread(s, sizeof( char ), 2, f) > 1)
{
unsigned short size = s[0]*256 +s[1];
if (size>0)
{
m_csRecv[WINDOWSNUM].Lock();
fread(vv[WINDOWSNUM].data, sizeof( char ), size, f);
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
if(recvlenall[WINDOWSNUM]+size+6<Q_SIZE)//
{
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,size+6);//
recvlenall[WINDOWSNUM]+=size+6;//11
}
else
{
int endlen = recvlenall[WINDOWSNUM]+size+6;//11
int leavelen = Q_SIZE - recvlenall[WINDOWSNUM];
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,leavelen);
recvlenall[WINDOWSNUM]+=leavelen;
recvlenall[WINDOWSNUM] = 0;
unsigned long headlen = endlen%Q_SIZE;
if((headlen < readlp[WINDOWSNUM])||(headlen == readlp[WINDOWSNUM]))
{
memcpy(recvbufferall[WINDOWSNUM],vv[WINDOWSNUM].data+leavelen,headlen);
recvlenall[WINDOWSNUM] = headlen;
}
}//else
m_csRecv[WINDOWSNUM].Unlock();
}
fclose(f);
return current_size+size+2;
}
问题在这段代码:
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
加上这6个字节,则历史回放不正常,不加需要修改记录时文件的存储格式,可以做到播放正常,但是和以往软件不兼容,我希望在能和以往软件兼容,但是这段代码应该没问题,因为debug下他是好的。可是到底问题在哪里呢,请高手指点!

解决方案 »

  1.   

    在VC中当整个工程较大时,软件时常为出现在DEBUG状态下能运行而在RELEASE状态下无法运行的情况。由于开发者通常在DEBUG状态下开发软件,所以这种情况时常是在我们辛苦工作一两个月后,满怀信心的准备将软件发行时发生。为了避免无谓的损失,我们最好进行以下的检查:1、时常测试软件的两种版本。2、不要轻易将问题归结为DEBUG/RELEASE问题,除非你已经充分对两种版本进行了测试。3、预处理的不同,也有可能引起这样的问题。
    出现问题的一种可能性是在不同版本的编译间定义了不同的预处理标记。请对你的DEBUG版本的软件试一下以下改动: 在"Project Setting(ALT-F7)" 中的C/C++项中设置目录(category)为"General",并且改动"_DEBUG"定义为"NDEBUG". 
    设置目录为"Preprocessor"并且添加定义"_DEBUG到"Undefined Symbols"输入框. 
    选择Rebuild ALL,重新编译.
    如果经过编译的程序产生了问题,请对代码进行如下改动: 
    将ASSERT() 改为 VERIFY()。因为ASSERT中的内容在Release版本中不被编译。 
    找出定义在"#ifdef _DEBUG"中的代码,如果在RELEASE版本中需要这些代码请将他们移到定义外。 
    查找TRACE(...)中代码,因为这些代码在RELEASE中也不被编译。
    所以请认真检查那些在RELEASE中需要的代码是否并没有被编译。 4、变量的初始化所带来的不同,在不同的系统,或是在DEBUG/RELEASE版本间都存在这样的差异,所以请对变量进行初始化。 5、是否在编译时已经有了警告?请将警告级别设置为3或4,然后保证在编译时没有警告出现. 6、是否改动了资源文件. 7、此外对RELEASE版本的软件也可以进行调试,请做如下改动: 在"Project Settings" 中 "C++/C " 项目下设置 "category" 为 "General" 并且将"Debug Info"设置为 "Program Database". 
    在"Link"项目下选中"Generate Debug Info"检查框。 
    "Rebuild All"
    如此做法会产生的一些限制: 
    无法获得在MFC DLL中的变量的值。 
    必须对该软件所使用的所有DLL工程都进行改动。 
    另:
    MS BUG:MS的一份技术文档中表明,在VC5中对于DLL的"Maximize Speed"优化选项并未被完全支持,因此这将会引起内存错误并导致程序崩溃。
      

  2.   

    Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。
      

  3.   

    未初始化的变量在debug下可能是有一个初始值的,因为是VC在帮你管理内存,但是Release就可能是任意值了,要看该位置以前做了什么。你仔细检查一下这加上去的六个字节的值对不对,会不会影响处理端。