iCAx开思网

标题: CAA 的一个调试错误,请求支援 [打印本页]

作者: wndcool    时间: 2005-9-27 12:09
标题: CAA 的一个调试错误,请求支援
我的代码较长,3000多行,算法比较复杂,不能都给出,这里给出错误和相关代码,请高手指点

+=============================================+
! An unhandled exception occurred in CATIA V5 !
+=============================================+

The error is : Allocation failed (11020288 bytes).
An allocation of 11020288 bytes failed.
Close the open documents that are useless, save your work, restart a new session
.


-> Error logged in C:\Documents and Settings\Administrator\Local Settings\Applic
ation Data\DassaultSystemes\CATTemp\error.log

-> Abend file is C:\Documents and Settings\Administrator\Local Settings\Applicat
ion Data\DassaultSystemes\CATTemp\AbendTrace_Administrator_d270_h10m45_0.txt
+===============================================+
+ AN UNRECOVERABLE ERROR HAS OCCURED !!!        +
+-----------------------------------------------+
+ THE ERROR IS                                  +

+                                               +
+===============================================+
+ ABORTING                                      +
+===============================================+

这里为什么会一下需要这么多内存呢,出错的地方已经进行了好几百次循环都没有问题,而且每次循环的内存都释放掉了,在任务管理器的情况是这样的:

物理内存中可用数 还有大概800多MB,内存使用大概有1.5GB多,我机器物理内存有2G,还有虚拟内存几个G,
为什么会有这个错误呢。

出错代码是这样的:
                                                                  
CATLISTP(CATCell) listCellsOfCurves1;
CATBody* tmpJoin3FeatResultBody1=NULL;
CATBody* tmpJoin3FeatResultBody2=NULL;
CATBody* tmpJoin3FeatResultBody3=NULL;
CATBody* tmpJoin3FeatResultBody=NULL;
for(int nbJoin=1;nbJoin<=3;nbJoin++)
{
         CATIGeometricalElement *pGeomEltOnCurFeatJoin3Feat = 0;
         rc = CATBodyListOfJoin[nbJoin]->QueryInterface(IID_CATIGeometricalElement,
                                                                                                        (void**)&pGeomEltOnCurFeatJoin3Feat);            
        CATBody_var Join3FeatResultBody = pGeomEltOnCurFeatJoin3Feat->GetBodyResult();
        CATBody* tmpJoin3FeatpCATBody=0;
        rc=Join3FeatResultBody->QueryInterface(IID_CATBody,(void**)&tmpJoin3FeatpCATBody);
        CATHybIntersect* tmpJoin3FeatHybIntersect=::CATCreateTopIntersect(tmpFactory,itmpData,piTetra,tmpJoin3FeatpCATBody);
       if(tmpJoin3FeatHybIntersect!=NULL)
      {
                                                                                tmpJoin3FeatHybIntersect->Run();
                                                                                std::cout<<"judge number in tmpJoin3FeatHybIntersect  "<<std::endl;
                                                                                tmpJoin3FeatResultBody= tmpJoin3FeatHybIntersect->GetResult( );
                                                                                if(tmpJoin3FeatResultBody!=NULL)  
                                                                                {
                                                                                    if(nbJoin==1)
                                                                                 tmpJoin3FeatResultBody1=tmpJoin3FeatResultBody;
                                                                                if(nbJoin==2)
                                                                                tmpJoin3FeatResultBody2=tmpJoin3FeatResultBody;
                                                                                if(nbJoin==3)
                                                                                tmpJoin3FeatResultBody3=tmpJoin3FeatResultBody;
                                                                                long nbDomain = tmpJoin3FeatResultBody->GetNbDomains();
                                                                                std::cout<<"nbDomain  "<<nbDomain<<std::endl;
                                                                                for(int domainnumber1=1;domainnumber1<=nbDomain;domainnumber1++)
                                                                                {
                     }

后面的代码我就不贴了,主要就是对数据的处理了。

错误是在这里发生的:tmpJoin3FeatResultBody= tmpJoin3FeatHybIntersect->GetResult( );

这段代码外面还有循环,大概要循环5000次吧,每次循环内存都释放的,只有个double被我记录下来。为什么循环大概500次后会有这个错误呢,而且每次错误发生的循环次数不是一样的,也就是说,视我当时机器是否还运行其他程序有关,别的程序占用多少内存有关。不管怎样,为什么会一下子需要那么多内存呢,而且当错误发生时我还有那么多的内存。

各位高手,请指点,我对操作系统之类的知道的不多,满皮毛的,请指教啊,满急的!!!!!
作者: saeba    时间: 2005-9-27 13:08
11020288 bytes其实并不多,也就是10MB多
但是你的内存使用大概有1.5GB多,确实是挺惊人的,看来是在处理很大的model
具体的原因,如果不深入CATIA的内存管理,可能很难查出来
如果想确认到底是不是内存不够的问题,建议你在64位WinXP上试一下,
或者32bit的WinXP用/3G来启动打开3G模式,这样可用内存会大一些
作者: wndcool    时间: 2005-9-27 13:39
我确实搞错了这个东西,只有10M多点而已,但是为什么会有这个错误呢,我还有那么多内存呢,内存应该够用才对啊
作者: saeba    时间: 2005-9-27 14:11
我猜想,也许CATIA需要的是一大块连续的内存(大于1.5GB)
而你虽然还有800MB(真的吗?1.5G+800M>2G),可能都是一些零碎的空间?
所以想让你试试更大内存的情况下是否还发生。
作者: xyzhu    时间: 2005-9-27 15:29
>CATHybIntersect* tmpJoin3FeatHybIntersect=::CATCreateTopIntersect(tmpFactory,itmpData,piTetra,tmpJoin3FeatpCATBody);
在GetResult之后用delete将其删除.
一般情况下,用CAA编程,有点memory leak 问题不大, 但你有5000个循环,就不得不小心了.比如 pGeomEltOnCurFeatJoin3Feat 用完之后不知道是不是删掉了,建议用CATIGeometricalElement_var.
作者: saeba    时间: 2005-9-27 15:53
xyzhu说得没错,
还有一个,计算完成后不用的tmpBody也要用CATICGMContainer::Remove()释放
你说你每次循环内存都释放的,建议检查一下这些是否都做到了。
用CSC(check source files...)查一下你的代码(估计你已经作了)看看有没有漏掉的。
作者: jmyu    时间: 2005-9-27 15:59
顶呀
作者: wndcool    时间: 2005-9-27 17:02
tmpBody我用CATICGMContainer::Remove()删除了的,tmpJoin3FeatHybIntersect我也用delete了的,pGeomEltOnCurFeatJoin3Feat 接口所指的组件,我整个程序都要用,这里是不能够释放掉的,即使这里把它Release()了,还是有很多地方用到这个组件的,进入到这5000次循环后,每次循环后物理内存都不会少,反而增加的,也许是因为有部分内存换到了虚拟内存里面
作者: wndcool    时间: 2005-9-27 17:04
delete tmpJoin3FeatHybIntersect;                                                        tmpJoin3FeatHybIntersect=NULL;

if(tmpJoin3FeatResultBody1!=NULL)
                                                                                        tmpFactory->Remove(tmpJoin3FeatResultBody1,CATICGMContainer::RemoveDependancies );
                                                                                if(tmpJoin3FeatResultBody2!=NULL)
                                                                                        tmpFactory->Remove(tmpJoin3FeatResultBody2,CATICGMContainer::RemoveDependancies );
                                                                                if(tmpJoin3FeatResultBody3!=NULL)
                                                                                        tmpFactory->Remove(tmpJoin3FeatResultBody3,CATICGMContainer::RemoveDependancies );

这些都释放掉了的
作者: wndcool    时间: 2005-9-27 17:15
哈,我还真没用过CSC(check source files...)个呢,因为一直都没出这些问题,我刚才查了一下,问题不大,不过我先把需要注意安全的地方给安全一下,不过,我觉得效果不大,感觉中...........解决不了这个错误。等我把不安全因素改一下再来报告结果,先吃饭去
作者: wndcool    时间: 2005-9-27 17:21
原帖由 saeba 于 2005-9-27 14:11 发表
我猜想,也许CATIA需要的是一大块连续的内存(大于1.5GB)
而你虽然还有800MB(真的吗?1.5G+800M>2G),可能都是一些零碎的空间?
所以想让你试试更大内存的情况下是否还发生。



实际情况是这样的,用了1.5G多的内存,还有800M的内存,因为有虚拟内存啊。
CATIA为什么会需要这样大的一块内存呢,即使一次分配多点,我想也不会一次要大于1.5GB吧,那样的话,很多应用都无法用了,毕竟不是每个机器都配这么大内存的啊。
对于零碎的空间问题,用更大内存,现在我还没法实现,我们这里用的都是2000操作系统,2G内存,512一根的,暂时还想看看有没有别的办法解决,实在不行才能跟老师提换大内存看看。
作者: wndcool    时间: 2005-9-27 20:21
CSC(check source files...)过了,没什么效果,问题不在这里面
作者: xyzhu    时间: 2005-9-27 21:58
建议使用逐步收缩法: 先把循环体内的内容全都注释掉,运行,应该没错误.然后一点点加入Code,希望能找出哪段Code有问题.
如果能找出来,余下的问题就好办多了.
作者: acoka    时间: 2005-9-29 14:51
1年前是DS的开发伙伴处理leak的高峰
我曾经做过一个operator,因为type miss,内存没有释放掉,小的东西不要紧,处理实际的模型的时候,用10次就出错,说处理失败,(内存用不够了如果出现crash说明程序的错误检查不够)
你发的部分对分析你在哪里导致泄漏没有多大帮助,
GetResult出错也一般与内存无关,否则在run的时候就出错了(所以一般只有CreateOperator和Run用CATTry圈起来)
安装的时候的soucrce check xlm很松的,比如  aList[]->就不会被检查出来,
作者: wndcool    时间: 2005-9-29 20:50
今天我把CATCreateTopIntersect这个CATTry起来了,结果还是在GetResult那里出错了。
我想在我GetResult()前,或者说在Run前,CATCreateTopIntersect并没有进行真的交运算,这样的做法会使CATCreateTopIntersect具有很高的灵活性,如果我来写CATCreateTopIntersect,我也不会在Run前就做真的交结果,只有当调用者真的需要的时候,也就是Run的时候我才会真的计算,然后分配内存,存储结果的。

acoka 兄,这个错误我不明白的地方是这样的,我物理内存还有800MB,程序竟然ALLOCATION Failed,这个错误到底应该大概可能是什么引起的呢?注意的是:这个代码已经循环了500次左右
作者: wndcool    时间: 2005-9-29 21:08
还有两行错误信息我忘记发了。
at G:\CXR14\BSF\.\Mathematics\CATCGMKernel.m\src\CATCGMemory.cpp:164
at G:\CXR14\BSF\.\Mathematics\CATCGMKernel.m\src\CATCGMemory.cpp:164
这是不是CAA自己进行内存管理的地方呢???我在帮助里都查不到相关的信息
作者: acoka    时间: 2005-9-30 09:26
偶尔会出现类似错误,比如List范围外的访问(内存范围外访问)
你是在CATGeomotry.cpp出错,说明要处理的图形有问题的可能性很大
或许你的设计书对图形的处理考虑到的case有欠缺,或Ref或lifecycle有不完善的地方

CreateTope不是每个都要CATTry的,有些在Create的时候就要对参数进行图形处理后才设到member的才要,基本都只要圈run就可以,需要圈Create的会在help里写明的

GetResult一般只是把Run后设在member的point给return _pResult;出来而已,

你在系统参数里加这么一条  Disable_TieChain   -> YES
看看你的程序会不会down得更早,
作者: wndcool    时间: 2005-9-30 11:18
果然RUN有问题,我再看看到底是什么问题
作者: wndcool    时间: 2005-9-30 18:28
哎,问题依旧!!!!!!!!!!!!!
at G:\CXR14\BSF\.\Mathematics\CATCGMKernel.m\src\CATCGMemory.cpp:164
at G:\CXR14\BSF\.\Mathematics\CATCGMKernel.m\src\CATCGMemory.cpp:164

tmpId   106
tmpMessage   Allocation failed (11020288 bytes).
An allocation of 11020288 bytes failed.
Close the open documents that are useless, save your work, restart a new session
.
judge number in tmpJoin3FeatHybIntersect
+=============================================+
! An unhandled exception occurred in CATIA V5 !
+=============================================+

The error is : Topological Operator:
Treatment aborted on Invalid GetResult() method management.
Run() method must be call before GetResult() method.


-> Error logged in C:\Documents and Settings\Administrator\Local Settings\Applic
ation Data\DassaultSystemes\CATTemp\error.log

-> Abend file is C:\Documents and Settings\Administrator\Local Settings\Applicat
ion Data\DassaultSystemes\CATTemp\AbendTrace_Administrator_d273_h15m47_0.txt
+===============================================+
+ AN UNRECOVERABLE ERROR HAS OCCURED !!!        +
+-----------------------------------------------+
+ THE ERROR IS                                  +

+                                               +
+===============================================+
+ ABORTING                                      +
+===============================================+
Terminating ...

错误ID是106,错误信息输出来还是那样
作者: acoka    时间: 2005-10-1 01:51
不是你编程有错就是你的设计书有错
你有reviewer吗?问问管你的leader,如果你是学生,问问你老师
自己附近的人是最好问的




欢迎光临 iCAx开思网 (https://www.icax.org/) Powered by Discuz! X3.3