SFML community forums
Help => Graphics => Topic started by: slotdev on August 24, 2011, 11:01:38 pm
-
Hi
I'm getting a 0xC0000005 crash when my sf::Font stuff is being destroyed at the end of the program.
In wglcontext.cpp, WglContext::CreateContext
if (sharedContext)
{
// wglShareLists doesn't seem to be thread-safe
static Mutex mutex;
Lock lock(mutex); // CRASHES IN HERE
if (!wglShareLists(sharedContext, myContext))
Err() << "Failed to share the OpenGL context" << std::endl;
}
myMutex contains:
- myMutex {DebugInfo=0xfeeefeee LockCount=-17891602 RecursionCount=-17891602 ...} _RTL_CRITICAL_SECTION
+ DebugInfo 0xfeeefeee {Type=??? CreatorBackTraceIndex=??? CriticalSection=??? ...} _RTL_CRITICAL_SECTION_DEBUG *
LockCount -17891602 long
RecursionCount -17891602 long
OwningThread 0xfeeefeee void *
LockSemaphore 0xfeeefeee void *
SpinCount 4277075694 unsigned long
The 0xFEEEFEEE is, if I'm not mistaken, Microsoft's way of marking heap memory that has been deallocated.
Any ideas? I can easily replicate the problem but I can't easily remove portions to code to post here :(
Thanks
-
Stack trace:
ntdll.dll!77b81c1d()
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll]
PR1030.exe!sf::priv::MutexImpl::Lock() Line 52 + 0xc bytes C++
PR1030.exe!sf::Mutex::Lock() Line 62 C++
PR1030.exe!sf::Lock::Lock(sf::Mutex & mutex={...}) Line 39 C++
PR1030.exe!sf::priv::WglContext::CreateContext(sf::priv::WglContext * shared=0x0263eba8, unsigned int bitsPerPixel=32, const sf::ContextSettings & settings={...}) Line 315 + 0x10 bytes C++
PR1030.exe!sf::priv::WglContext::WglContext(sf::priv::WglContext * shared=0x0263eba8) Line 59 C++
PR1030.exe!sf::priv::GlContext::New() Line 145 + 0x28 bytes C++
PR1030.exe!`anonymous namespace'::GetInternalContext() Line 90 + 0x5 bytes C++
PR1030.exe!sf::priv::GlContext::EnsureContext() Line 138 + 0x7 bytes C++
PR1030.exe!sf::GlResource::EnsureGlContext() Line 86 C++
PR1030.exe!sf::Texture::~Texture() Line 76 C++
> PR1030.exe!sf::Font::Page::~Page() + 0x4e bytes C++
PR1030.exe!std::pair<unsigned int const ,sf::Font::Page>::~pair<unsigned int const ,sf::Font::Page>() + 0x19 bytes C++
PR1030.exe!std::_Tree_nod<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Node::~_Node() + 0x19 bytes C++
PR1030.exe!std::_Tree_nod<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Node::`scalar deleting destructor'() + 0x16 bytes C++
PR1030.exe!std::_Destroy<std::_Tree_nod<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Node>(std::_Tree_nod<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Node * _Ptr=0x0a5509f8) Line 61 C++
PR1030.exe!std::allocator<std::_Tree_nod<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Node>::destroy(std::_Tree_nod<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Node * _Ptr=0x0a5509f8) Line 161 + 0x9 bytes C++
PR1030.exe!std::_Tree<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Erase(std::_Tree_nod<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::_Node * _Rootnode=0x0a5509f8) Line 1078 C++
PR1030.exe!std::_Tree<std::_Tmap_traits<unsigned int,sf::Font::Page,std::less<unsigned int>,std::allocator<std::pair<unsigned int const ,sf::Font::Page> >,0> >::clear() Line 955 C++
PR1030.exe!sf::Font::Cleanup() Line 390 C++
PR1030.exe!sf::Font::~Font() Line 100 C++
PR1030.exe!TextElement::~TextElement() Line 46 + 0x45 bytes C++
PR1030.exe!std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement>::~pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement>() + 0x58 bytes C++
PR1030.exe!std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node::~_Node() + 0x5b bytes C++
PR1030.exe!std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node::`scalar deleting destructor'() + 0x2b bytes C++
PR1030.exe!std::_Destroy<std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node>(std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node * _Ptr=0x04a824c0) Line 61 C++
PR1030.exe!std::allocator<std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node>::destroy(std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node * _Ptr=0x04a824c0) Line 161 + 0x9 bytes C++
PR1030.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Erase(std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node * _Rootnode=0x04a824c0) Line 1078 C++
PR1030.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Erase(std::_Tree_nod<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Node * _Rootnode=0x090b1270) Line 1076 C++
PR1030.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::clear() Line 955 C++
PR1030.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::erase(std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::iterator _First=("B2_RANDOM",{textHandle="B2_RANDOM" fontFile={...} fontData={...} ...}), std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::iterator _Last=(<Bad Ptr>,{textHandle=<Bad Ptr> fontFile={...} fontData={...} ...})) Line 921 C++
PR1030.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::_Tidy() Line 1327 + 0x6d bytes C++
PR1030.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >::~_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> >,0> >() Line 527 C++
PR1030.exe!std::map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> > >::~map<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,TextElement,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,TextElement> > >() + 0x58 bytes C++
PR1030.exe!`dynamic atexit destructor for 'TextManager::textData''() + 0x28 bytes C++
PR1030.exe!doexit(int code=0, int quick=0, int retcaller=0) Line 553 C
PR1030.exe!exit(int code=0) Line 398 + 0xd bytes C
PR1030.exe!__tmainCRTStartup() Line 333 C
PR1030.exe!wWinMainCRTStartup() Line 196 C
kernel32.dll!758c3677()
ntdll.dll!77b59f02()
ntdll.dll!77b59ed5()
PR1030.exe!std::_Tree<std::_Tmap_traits<std::basic_string<char,std::char_traits<char>,std::allocator<char> >,bool,std::less<std::basic_string<char,std::char_traits<char>,std::allocator<char> > >,std::allocator<std::pair<std::basic_string<char,std::char_traits<char>,std::allocator<char> > const ,bool> >,0> >::iterator::operator++(int __formal=3670136) Line 469 + 0xc bytes C++
PR1030.exe!std::_Tree<std::_Tmap_traits<int,sf::Texture const *,std::less<int>,std::allocator<std::pair<int const ,sf::Texture const *> >,0> >::erase(std::_Tree<std::_Tmap_traits<int,sf::Texture const *,std::less<int>,std::allocator<std::pair<int const ,sf::Texture const *> >,0> >::iterator _Where=(...,...) Line 853 + 0x9 bytes C++
f8830142()
-
It might be related to this issue:
https://github.com/SFML/SFML/issues/59
-
Hmm I don't think it is.
I don't have an ATI graphics card, and nor do I use the default SFML font.
This issue is really bugging me, and I need a fix before I can release my app.
Shall I submit a bug in Git for this?
-
Do you have global SFML objects (variables that are destroyed at global exit)?
and nor do I use the default SFML font
Instanciating a sf::Text with its default constructor is enough to instanciate the default font.
Shall I submit a bug in Git for this?
We should discuss it first on the forum :)
-
Yes I do, but in any case, why does this occur and what can be done about it?
-
Sorry to dig this one year old topic but I also crashed at exit because of the defaultFont problem. I had to replace all my sf::Text by pointers. I'm pretty sure that's not the intended behaviour. Hope it will be fixed or annouced in the tutorials at least. I had it with both SFML 2 RC and a dev snapshot of SFML 2 RC. Anyway thank you for this API and keep up the good work Laurent.
tl;dr: this issue is still open ; use sf::Text * text instead of sf::Text text