Hi,

We have been looking for a hard-to-reproduce crash in our software that seems to originate from a double delete inside osg. I have (finally) been able to reproduce the crash using a version of the osgterrain-example that _exaggerates_ the usage pattern that crashes our application.

In examples/osgterrain.cpp remove "return viwer.run();" an exchange it with:

  while(!viewer.done())
    {
        osg::Timer_t start_tick = osg::Timer::instance()->tick();
        float sr = rand() * 1.0 / RAND_MAX ;
        std::cerr << sr;
        
        viewer.getCamera()->setLODScale(sr*10);
        terrain->setSampleRatio( sr );       

        osg::Timer_t middle_tick = osg::Timer::instance()->tick();
        
std::cerr << osg::Timer::instance()->delta_m(start_tick, middle_tick) << std::flush;

        viewer.frame();
std::cerr << ' ' << osg::Timer::instance()->delta_m(middle_tick, osg::Timer::instance()->tick()) << std::endl;
    }
  return 0;

When run (tested on ive earth models generated with osgdem) the frame time slowly increases, and, after a while, it warns about deleting a still referenced object and then (after arbitrary time) crashes with a glibc error.

Is this usage (setLODScale + setSampleRatio) safe? If not how should these functions be called?

If it's a bug, we would be _very_ happy to have it fixed or pointers about where to look in the code. We've previously submitted a patch that switched to a ReentrantMutex in osgTerrain/Terrain.cpp (changeset 12904), could this be a similar issue?

My system is running Centos 6.3 (x86_64) and I compiled osg in debug mode with gcc 4.4.6. I have tested both against the 3.0.1 tag and trunk (r13106).

Since I suspect a threading issue; OpenThreads/Config looks like this:
#define _OPENTHREADS_ATOMIC_USE_GCC_BUILTINS
/* #undef _OPENTHREADS_ATOMIC_USE_MIPOSPRO_BUILTINS */
/* #undef _OPENTHREADS_ATOMIC_USE_SUN */
/* #undef _OPENTHREADS_ATOMIC_USE_WIN32_INTERLOCKED */
/* #undef _OPENTHREADS_ATOMIC_USE_BSD_ATOMIC */
/* #undef _OPENTHREADS_ATOMIC_USE_MUTEX */
/* #undef OT_LIBRARY_STATIC */

If I set a break point in the warning for deleting still referenced I get the following stack trace (using the osg 3.0.1 tag):

Breakpoint 1, osg::Referenced::~Referenced (this=0xaec2160, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Referenced.cpp:236 236 OSG_WARN<<"Warning: deleting still referenced object "<<this<<" of type '"<<typeid(this).name()<<"'"<<std::endl;
(gdb) bt
#0 osg::Referenced::~Referenced (this=0xaec2160, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Referenced.cpp:236 #1 0x00007ffff79e467c in osg::Object::~Object (this=0xaec2160, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Object.cpp:45 #2 0x00007ffff79dd71d in osg::Node::~Node (this=0xaec2160, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Node.cpp:94 #3 0x00007ffff7993953 in osg::Group::~Group (this=0xaec2160, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Group.cpp:53 #4 0x00007ffff5df4ae8 in osgTerrain::TerrainTile::~TerrainTile (this=0xaec2160, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osgTerrain/TerrainTile.cpp:95 #5 0x00007ffff5df4b1e in osgTerrain::TerrainTile::~TerrainTile (this=0xaec2160, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osgTerrain/TerrainTile.cpp:95 #6 0x00007ffff7a131a6 in osg::Referenced::signalObserversAndDelete (this=0xaec2160, signalDelete=true, doDelete=true) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Referenced.cpp:323 #7 0x000000000040b07d in osg::Referenced::unref (this=0xaec2160) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/Referenced:198 #8 0x000000000040cd3b in osg::ref_ptr<osg::Node>::~ref_ptr (this=0x478d410, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/ref_ptr:35 #9 0x00007ffff799627e in std::_Destroy<osg::ref_ptr<osg::Node> > (__pointer=0x478d410) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:83 #10 0x00007ffff7996084 in std::_Destroy_aux<false>::__destroy<osg::ref_ptr<osg::Node>*> (__first=0x478d410, __last=0x478d418) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:93 #11 0x00007ffff7995dcf in std::_Destroy<osg::ref_ptr<osg::Node>*> (__first=0x478d410, __last=0x478d418) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:116 #12 0x00007ffff7995847 in std::_Destroy<osg::ref_ptr<osg::Node>*, osg::ref_ptr<osg::Node> > (__first=0x478d410, __last=0x478d418) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:142 #13 0x00007ffff7994e56 in std::vector<osg::ref_ptr<osg::Node>, std::allocator<osg::ref_ptr<osg::Node> > >::~vector (this=0xaec1fd8, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:313 #14 0x00007ffff7993926 in osg::Group::~Group (this=0xaec1f20, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Group.cpp:53 #15 0x00007ffff79c9838 in osg::LOD::~LOD (this=0xaec1f20, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/LOD:127 #16 0x00007ffff79f56ea in osg::PagedLOD::~PagedLOD (this=0xaec1f20, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/PagedLOD.cpp:73 #17 0x00007ffff79f5720 in osg::PagedLOD::~PagedLOD (this=0xaec1f20, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/PagedLOD.cpp:73 #18 0x00007ffff7a131a6 in osg::Referenced::signalObserversAndDelete (this=0xaec1f20, signalDelete=true, doDelete=true) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Referenced.cpp:323 #19 0x000000000040b07d in osg::Referenced::unref (this=0xaec1f20) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/Referenced:198 #20 0x000000000040cd3b in osg::ref_ptr<osg::Node>::~ref_ptr (this=0x478d590, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/ref_ptr:35 #21 0x00007ffff799627e in std::_Destroy<osg::ref_ptr<osg::Node> > (__pointer=0x478d590) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:83 #22 0x00007ffff7996084 in std::_Destroy_aux<false>::__destroy<osg::ref_ptr<osg::Node>*> (__first=0x478d590, __last=0x478d5a0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:93 #23 0x00007ffff7995dcf in std::_Destroy<osg::ref_ptr<osg::Node>*> (__first=0x478d580, __last=0x478d5a0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:116 #24 0x00007ffff7995847 in std::_Destroy<osg::ref_ptr<osg::Node>*, osg::ref_ptr<osg::Node> > (__first=0x478d580, __last=0x478d5a0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:142 #25 0x00007ffff7994e56 in std::vector<osg::ref_ptr<osg::Node>, std::allocator<osg::ref_ptr<osg::Node> > >::~vector (this=0xaf84d48, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:313 #26 0x00007ffff7993926 in osg::Group::~Group (this=0xaf84c90, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Group.cpp:53 #27 0x00007ffff799398a in osg::Group::~Group (this=0xaf84c90, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Group.cpp:53 #28 0x00007ffff7a131a6 in osg::Referenced::signalObserversAndDelete (this=0xaf84c90, signalDelete=true, doDelete=true) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Referenced.cpp:323 #29 0x000000000040b07d in osg::Referenced::unref (this=0xaf84c90) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/Referenced:198 #30 0x000000000040cd3b in osg::ref_ptr<osg::Node>::~ref_ptr (this=0xb9cf88, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/ref_ptr:35 #31 0x00007ffff799627e in std::_Destroy<osg::ref_ptr<osg::Node> > (__pointer=0xb9cf88) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:83 #32 0x00007ffff7996084 in std::_Destroy_aux<false>::__destroy<osg::ref_ptr<osg::Node>*> (__first=0xb9cf88, __last=0xb9cf90) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:93 #33 0x00007ffff7995dcf in std::_Destroy<osg::ref_ptr<osg::Node>*> (__first=0xb9cf80, __last=0xb9cf90) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:116 #34 0x00007ffff7995847 in std::_Destroy<osg::ref_ptr<osg::Node>*, osg::ref_ptr<osg::Node> > (__first=0xb9cf80, __last=0xb9cf90) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:142 #35 0x00007ffff7994e56 in std::vector<osg::ref_ptr<osg::Node>, std::allocator<osg::ref_ptr<osg::Node> > >::~vector (this=0x948df8, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:313 #36 0x00007ffff7993926 in osg::Group::~Group (this=0x948d40, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Group.cpp:53 #37 0x00007ffff79c9838 in osg::LOD::~LOD (this=0x948d40, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/LOD:127 #38 0x00007ffff79f56ea in osg::PagedLOD::~PagedLOD (this=0x948d40, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/PagedLOD.cpp:73 #39 0x00007ffff79f5720 in osg::PagedLOD::~PagedLOD (this=0x948d40, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/PagedLOD.cpp:73 #40 0x00007ffff7a131a6 in osg::Referenced::signalObserversAndDelete (this=0x948d40, signalDelete=true, doDelete=true) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Referenced.cpp:323 #41 0x000000000040b07d in osg::Referenced::unref (this=0x948d40) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/Referenced:198 #42 0x000000000040cd3b in osg::ref_ptr<osg::Node>::~ref_ptr (this=0xa78ba0, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/ref_ptr:35 #43 0x00007ffff799627e in std::_Destroy<osg::ref_ptr<osg::Node> > (__pointer=0xa78ba0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:83 #44 0x00007ffff7996084 in std::_Destroy_aux<false>::__destroy<osg::ref_ptr<osg::Node>*> (__first=0xa78ba0, __last=0xa78bc0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:93 #45 0x00007ffff7995dcf in std::_Destroy<osg::ref_ptr<osg::Node>*> (__first=0xa78ba0, __last=0xa78bc0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:116 #46 0x00007ffff7995847 in std::_Destroy<osg::ref_ptr<osg::Node>*, osg::ref_ptr<osg::Node> > (__first=0xa78ba0, __last=0xa78bc0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_construct.h:142 #47 0x00007ffff7994e56 in std::vector<osg::ref_ptr<osg::Node>, std::allocator<osg::ref_ptr<osg::Node> > >::~vector (this=0x962e78, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_vector.h:313 #48 0x00007ffff7993926 in osg::Group::~Group (this=0x962dc0, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Group.cpp:53 #49 0x00007ffff799398a in osg::Group::~Group (this=0x962dc0, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Group.cpp:53 #50 0x00007ffff7a131a6 in osg::Referenced::signalObserversAndDelete (this=0x962dc0, signalDelete=true, doDelete=true) at /home/ola/src/OpenSceneGraph-3.0.1/src/osg/Referenced.cpp:323 #51 0x000000000040b07d in osg::Referenced::unref (this=0x962dc0) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/Referenced:198 #52 0x00007ffff78da577 in osg::ref_ptr<osg::Object>::~ref_ptr (this=0x114d9e0, __in_chrg=<value optimized out>) at /home/ola/src/OpenSceneGraph-3.0.1/include/osg/ref_ptr:35
---Type <return> to continue, or q <return> to quit---
#53 0x00007ffff7aa602e in __gnu_cxx::new_allocator<osg::ref_ptr<osg::Object> >::destroy (this=0x7ffff366f9df, __p=0x114d9e0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/ext/new_allocator.h:115 #54 0x00007ffff72d85d3 in std::_List_base<osg::ref_ptr<osg::Object>, std::allocator<osg::ref_ptr<osg::Object> > >::_M_clear (this=0x7ffff366fca0) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/list.tcc:76 #55 0x00007ffff72d5a75 in std::_List_base<osg::ref_ptr<osg::Object>, std::allocator<osg::ref_ptr<osg::Object> > >::~_List_base (this=0x7ffff366fca0, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_list.h:360 #56 0x00007ffff72d350c in std::list<osg::ref_ptr<osg::Object>, std::allocator<osg::ref_ptr<osg::Object> > >::~list (this=0x7ffff366fca0, __in_chrg=<value optimized out>) at /usr/lib/gcc/x86_64-redhat-linux/4.4.6/../../../../include/c++/4.4.6/bits/stl_list.h:418 #57 0x00007ffff72cafc6 in osgDB::DatabasePager::DatabaseThread::run (this=0x632440) at /home/ola/src/OpenSceneGraph-3.0.1/src/osgDB/DatabasePager.cpp:738 #58 0x00007ffff7dfa5fd in OpenThreads::ThreadPrivateActions::StartThread (data=0x632458) at /home/ola/src/OpenSceneGraph-3.0.1/src/OpenThreads/pthreads/PThread.cpp:181
#59 0x0000003994e07851 in start_thread () from /lib64/libpthread.so.0
#60 0x00000039942e76dd in clone () from /lib64/libc.so.6
(gdb)
(gdb)
(gdb) c
Continuing.
Warning: deleting still referenced object 0xaec2160 of type 'PN3osg10ReferencedE'
         the final reference count was 1, memory corruption possible.

*** glibc detected *** /home/ola/src/osg-3.0.1/bin/osgterraind: free(): invalid pointer: 0x000000000aec2160 ***

Cheers,

Ola

ps, I'll happily supply more data, stack traces, etc if needed.


--
Using Opera's revolutionary email client: http://www.opera.com/mail/

--
This email was Anti Virus checked by Astaro Security Gateway. 
http://www.astaro.com
_______________________________________________
osg-users mailing list
osg-users@lists.openscenegraph.org
http://lists.openscenegraph.org/listinfo.cgi/osg-users-openscenegraph.org

Reply via email to