查看: 2039|回复: 4

不知道大家遇到过这个问题没有:crash running with osg

[复制链接]

该用户从未签到

发表于 2009-1-19 22:30:54 | 显示全部楼层 |阅读模式
我有一个OSG程序跑得好好的,但是偶尔会死掉,现象和邮件组上一个用户的提问一样,不知道大家有没有遇到过?貌似VC2008自身的Bug。
在多线程环境下,检查了可能的线程冲突,实在困惑。向大家请教这个问题。

http://lists.openscenegraph.org/ ... 08-June/012357.html

[osg-users] Random crash running with osg
Hi All,

Running my application, I get a random crash I cannot identify.
The error is : "vector<bool> iterator not dereferencable"

Bu I've no vector<bool> in my code, So I gess it is in osg where the crash
append.
Maybe I make something wrong in my code, but I've no idea where or what the
bug can be...

The application uses a lot of OpenThreads, that modify the scenegraph, but
they looks synchronized now...

Any idea ?

Thank you.

Regards,
   Vincent.

Note :

Configuration : WinXP, osg 2.2 & 2.4
>

Stack trace on crash :

>    msvcp80d.dll!std::_Debug_message(const wchar_t * message=0x103ed770,
> const wchar_t * file=0x1039b478, unsigned int line=1463)  Ligne 23    C++
>
> osg35-osgd.dll!std::_Vb_reference<std::vector<bool,std::allocator<bool> >
> >::_Getptr()  Ligne 1463 + 0x17 octets    C++
>
> osg35-osgd.dll!std::_Vb_reference<std::vector<bool,std::allocator<bool> >
> >:perator bool()  Ligne 1453 + 0x8 octets    C++
>
> osg35-osgd.dll!std::_Vb_const_iterator<std::vector<bool,std::allocator<bool>
> > >::operator*()  Ligne 1523 + 0x24 octets    C++
>      osg35-osgd.dll!std::vector<bool,std::allocator<bool>
> >::operator[](unsigned int _Off=1)  Ligne 2010 + 0x41 octets    C++
>      osg35-osgd.dll!osg::Switch::computeBound()  Ligne 198 + 0x12 octets
> C++
>      osg35-osgd.dll!osg::Node::getBound()  Ligne 268 + 0x13 octets    C++
>      osg35-osgd.dll!osg::Group::computeBound()  Ligne 357 + 0x16 octets
> C++
>      osg35-osgd.dll!osg::Node::getBound()  Ligne 268 + 0x13 octets    C++
>      osg35-osgd.dll!osg::Group::computeBound()  Ligne 357 + 0x16 octets
> C++
>      osg35-osgd.dll!osg::Node::getBound()  Ligne 268 + 0x13 octets    C++
>      osg35-osgd.dll!osg::Node::isCullingActive()  Ligne 191 + 0x39
> octets    C++
>      osg35-osgd.dll!osg::CullStack::isCulled(const osg::Node & node={...})
> Ligne 109 + 0x8 octets    C++
>      osg35-osgUtild.dll!osgUtil::CullVisitor::apply(osg::Group &
> node={...})  Ligne 969 + 0x12 octets    C++
>      osg35-osgd.dll!osg::Group::accept(osg::NodeVisitor & nv={...})  Ligne
> 38 + 0x41 octets    C++
>      osg35-osgd.dll!osg::Group::traverse(osg::NodeVisitor & nv={...})
> Ligne 62 + 0x25 octets    C++
>      osg35-osgd.dll!osg::NodeVisitor::traverse(osg::Node & node={...})
> Ligne 181 + 0x1c octets    C++
>
> osg35-osgUtild.dll!osgUtil::CullVisitor::handle_cull_callbacks_and_traverse(osg::Node
> & node={...})  Ligne 277 + 0xf octets    C++
>      osg35-osgUtild.dll!osgUtil::CullVisitor::apply(osg::Group &
> node={...})  Ligne 981    C++
>      osg35-osgd.dll!osg::Group::accept(osg::NodeVisitor & nv={...})  Ligne
> 38 + 0x41 octets    C++
>      osg35-osgUtild.dll!osgUtil::SceneView::cullStage(const osg::Matrixd &
> projection={...}, const osg::Matrixd & modelview={...}, osgUtil::CullVisitor
> * cullVisitor=0x01fb46b8, osgUtil::StateGraph * rendergraph=0x01fb4220,
> osgUtil::RenderStage * renderStage=0x01fb42b8)  Ligne 821 + 0x42 octets
> C++
>      osg35-osgUtild.dll!osgUtil::SceneView::cull()  Ligne 687 + 0x4e
> octets    C++
>      osg35-osgViewerd.dll!osgViewer::Renderer::cull()  Ligne 285 + 0xf
> octets    C++
>      osg35-osgViewerd.dll!osgViewer::ViewerBase::renderingTraversals()
> Ligne 643 + 0x15 octets    C++
>      osg35-osgViewerd.dll!osgViewer::ViewerBase::frame(double
> simulationTime=1.7976931348623157e+308)  Ligne 583 + 0xf octets    C++
>      3DEM.exe!EM_Modules::run()  Ligne 302    C++
>      3DEM.exe!EM_Modules::init(HWND__ * hWnd=0x00000000)  Ligne 264 + 0xb
> octets    C++
>      3DEM.exe!main(int argc=1, char * * argv=0x01f32940)  Ligne 99 + 0xd
> octets    C++
>      3DEM.exe!__tmainCRTStartup()  Ligne 586 + 0x19 octets    C
>      3DEM.exe!mainCRTStartup()  Ligne 403    C
>      kernel32.dll!7c816fd7()
>      [Les frames ci-dessous sont peut-être incorrects et/ou manquants,
> aucun symbole chargé pour kernel32.dll]
>

[ 本帖最后由 kinsung 于 2009-1-19 22:39 编辑 ]

该用户从未签到

发表于 2009-1-19 23:05:58 | 显示全部楼层
可以检查一下有没有对象在运行时被动态更改了,这样的对象需要设置为DYNAMIC

该用户从未签到

 楼主| 发表于 2009-1-20 12:53:32 | 显示全部楼层
哦,谢谢,春节过后试试。

我的问题原因还是在多线程冲突,想办法处理后,几个小时之内还没有发生错误。

该用户从未签到

发表于 2009-3-12 10:06:20 | 显示全部楼层
这个问题是如何解决的?多谢了~~

该用户从未签到

 楼主| 发表于 2009-3-13 19:34:49 | 显示全部楼层
修改场景图内容的操作全部定义为OPNode类对象(或其子类对象),
实现一个ModifyScene(...)函数,在此函数中由外部程序调用,添加数据,生成一个OPNode类对象智能指针列表。
全部在PreFrame函数中使用OPNode类对象列表修改场景图内容(添加、删除、修改相关节点)。
其中ModifyScene和PreFrame函数都要使用线程冲突处理。
如:
//---------------------------------------
mutex mtx;
//---------------------------------------
ModifyScene()
{
scope_guard(mtx);
...
}
//---------------------------------------
PreFrame()
{
scope_guard(mtx);
...
}
这样,包括3D实体节点、文字节点、自定义绘制节点等等都不会出这个错误。
另外按王锐老师所说,把对象设置为DYNAMIC,可能更好,不过不设好象也不会出错,我还是设了。呵呵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表