Programmabsturz



  • Hat denn niemand eine Idee woran das liegen kann?
    Ich nehme an das ein Objekt nicht richtig zerstört wurde, aber welches?


  • Mod

    Meine Kristallkugel steht auf meinem Fensterbrett zu Hause in meinem Arbeitszimmer.

    Verate uns doch mal wo Dein Programm abstürzt?
    Was zeigt der Callstack an? D.h. welche Funktion wird gerade von wem ausgeführt.

    Nur so, kann man schwer was sehen. Gib uns einen Tipp und eine Chance...



  • Also wenn ich den Dialog kurz nachdem er erstellt wurde wieder schließe bekomme ich eine unbehandelte Ausnahme und der CallStack steht in der folgenden Routine:

    inline void* CThreadSlotData::GetThreadValue(int nSlot)
    {
    	EnterCriticalSection(&m_sect);
    	ASSERT(nSlot != 0 && nSlot < m_nMax);
    	ASSERT(m_pSlotData != NULL);
    	ASSERT(m_pSlotData[nSlot].dwFlags & SLOT_USED);
    	ASSERT(m_tlsIndex != (DWORD)-1);
    	if( nSlot <= 0 || nSlot >= m_nMax ) // check for retail builds.
    	{
    		LeaveCriticalSection(&m_sect);
    		return NULL;
    	}
    
    	CThreadData* pData = (CThreadData*)TlsGetValue(m_tlsIndex);
    	if (pData == NULL || nSlot >= pData->nCount)
    	{
    		LeaveCriticalSection(&m_sect);
    		return NULL;
    	}
    	void* pRetVal = pData->pData[nSlot];
    	LeaveCriticalSection(&m_sect);
    	return pRetVal;
    }
    

    Der CallStack steht dann in der letzten Zeile bei return pRetVal.

    Wenn ich mit dem beenden des Dialogs länger warte passiert dies nicht, dann stürtzt mein Programm ohne irgendeine Meldung ab. Ich habe dann mal einen Breakpoint gesetzt und mit F11 weitergesprungen bis ich dann in einen sehr langen Assemblercode kam, dort hab ich dann abgebrochen.
    Ich hoffe das hilft etwas weiter.


  • Mod

    Scheint, so als ob noch irgendetwas auf ein Objekt zugreifen will, das bereits zerstört ist.
    Schau Dir doch mal den Callstack genauer an. Da siehst Du doch wer was tun möchte...



  • Hmmm? Wie kann ich das denn dort sehen??


  • Mod

    Wenn Du das Callstack Fenster hats, wird doch Zeile für Zeile augelistet, wer wen wo aufruft.



  • Ich muss jetzt erstmal rausfinden wie ich das Callstack fenster öffne 😉
    Hatte das bisher noch nicht so benutzt.



  • Ahja die Aufrufliste hab ich jetzt gefunden.
    Wo muss ich nun einen Haltepunkt setzen?
    Und wie sehe ich dort was noch aufgerufen wird?
    Werde nicht schlau aus dem Code.


  • Mod

    Da musst Du keinen Haltepunkt setzen. Wenn es kracht kannst Du hier durch Doppelklick einfach sehen wer wen wann aufruft...

    Wo kracht es nun? Bei einem Destruktor vermute ich mal!



  • Hier zeig ich dir jetzt mal die Aufrufliste, die erscheint wenn es kracht.
    Vielleicht könntest du mir bitte erklären wie ich darazs sehe, wer wen aufgerufen hat.
    ntdll.dll!7c901230()
    ntdll.dll!7c96c943()
    ntdll.dll!7c949eb9()
    > mfc71d.dll!CThreadSlotData::GetThreadValue(int nSlot=14837864) Zeile 269 C++
    mfc71d.dll!CThreadSlotData::GetThreadValue(int nSlot=3) Zeile 269 C++
    mfc71d.dll!CThreadLocalObject::GetData(CNoTrackObject * (void)* pfnCreateObject=0x7c29dc40) Zeile 414 + 0x11 C++
    mfc71d.dll!CThreadLocal<AFX_MODULE_THREAD_STATE>::GetData() Zeile 177 + 0xd C++
    mfc71d.dll!AfxGetModuleThreadState() Zeile 243 C++
    0012e1b8()
    mfc71d.dll!CMapPtrToPtr::GetValueAt(void * key=0x002203fe) Zeile 185 + 0xc C++
    mfc71d.dll!CHandleMap::LookupPermanent(void * h=0x002203fe) Zeile 116 + 0x16 C++
    mfc71d.dll!CWnd::AssertValid() Zeile 888 + 0xf C++
    mfc71d.dll!CView::AssertValid() Zeile 500 C++
    mfc71d.dll!CFormView::AssertValid() Zeile 272 C++
    Par.exe!CParView::AssertValid() Zeile 1978 C++
    0000000a()
    ntdll.dll!7c96d6aa()
    user32.dll!77d4882a()
    user32.dll!77d4c63f()
    ntdll.dll!7c949d18()
    mfc71d.dll!CWnd::DefWindowProcA(unsigned int nMsg=1238036, unsigned int wParam=2082654585, long lParam=32) Zeile 1024 + 0x20 C++
    mfc71d.dll!CThreadLocal<_AFX_THREAD_STATE>::GetData() Zeile 177 + 0xd C++
    00000001()
    user32.dll!77d4d4ee()



  • Hab mein Problem immer noch nicht gelöst.
    Kann mir denn niemand helfen??



  • Wenn innerhalb der Methode "CMainFrame::OnViewDisplay()" ein Fenster erzeugt wird, dann sollte es seine eigene Warteschleife haben :

    // statt :
    
    while (::PeekMessage(&Msg, NULL,0,0,PM_NOREMOVE)) 
    { 
      if (!AfxGetApp()->PumpMessage()) {::PostQuitMessage  (0); break;} 
    } 
    
    // probier mal :
    
    while (::PeekMessage(&Msg, NULL,0,0,PM_REMOVE)) 
    { 
     ::TranslateMessage (&Msg);
     ::DispatchMessage  (&Msg);
    }
    


  • hmm, mal ausprobieren.



  • Nö, das funktioniert auch nicht!!!


Anmelden zum Antworten