Frage an die Profis: ASSERTION in tss_hooks.cpp (BOOST)
-
Hallo zusammen! ich habe da ein grosses Problem in meiner firma. ich habe eine recht komplexe software erstellt (verteilt, corba, c++, multithreading, boost, QT) und beim schliessen des Programms kommt immer nach ca 4 sekunden eine ASSERTION:
attached_threadcount == 0 in tss_hooks.cpp. der code dazu sieht so aus:
+ catch( ... )
{
- boost::call_once(init_threadmon_mutex, once_init_threadmon_mutex);
- boost::mutex::scoped_lock lock(*threadmon_mutex);- BOOST_ASSERT(attached_thread_count == 0);
+ return -1;Ich konnte auch mit hilfe einiger cracks in unserer firma einfach die
ursache nicht herausfinden. auch mit DevPartnerStudio kamen wir nicht weiter
scheint irgend ein thrading-problem zu sein. eigentlich stört es nicht gross,
da es nur beim herunterfahren passiert, aber wir können die software so
dem kunden nicht überlassen. auch das builden im releasemode kommt
aus versch. gründen nicht in frage. hat irgendjemand einen hinweis,
oder zumindest einen trick wie ich das symptom bekämpfen kann??vielen herzlichen dank!
andreas
-
Hm, kann mir da jetzt auch keinen reim drauf bilden.
Aber wenn das wirklich in einem catch(...) drin liegt, kann das (fast) alles sein.
Evtl. mal versuchen davor andere mögliche (std::)exceptions abzufangen, und what() ausgeben.Welche QT Version benutzt ihr?
Und etwas mehr infos währen hilfreich.
-
also wir benutzen QT 3.36 oder so, soviel ich weis. aber ein catch zuvor abzufangen geht nicht, denn das passiert ja alles im zuvor kompilierten boost-code. und eine weitere exception wird icht mehr geworfen. mehr infos ist schwer, das projekt ist unglaublich komplex und gross. aber kennt niemand einen trick wie ich auch in einer debug-version assertions ignorieren kann? (einfach NDEBUG nicht zu definieren gehn nicht..)
danke für deine mühe!
-
Andruu schrieb:
also wir benutzen QT 3.36 oder so, soviel ich weis. aber ein catch zuvor abzufangen geht nicht, denn das passiert ja alles im zuvor kompilierten boost-code. und eine weitere exception wird icht mehr geworfen. mehr infos ist schwer, das projekt ist unglaublich komplex und gross. aber kennt niemand einen trick wie ich auch in einer debug-version assertions ignorieren kann? (einfach NDEBUG nicht zu definieren gehn nicht..)
danke für deine mühe!
#ifdef _DEBUG oder DEBUG
BOOST_ASSERT(attached_thread_count == 0);
+ return -1;
#endifAber wie ich sehe ist eher das Problem dass attached_thread_count gleich 0 ist. Sonst würde diese Assert ja nicht formuliert sein würden, oder?
Eigentlich werden assertions in der Release-Version nicht mitkompiliert.
-
Also ich habe nun noch folgendes versucht:
ich habe die Releaseversion von boost gelinkt (boost_thread-vc80-mt-1_33_1.lib)
und zudem noch im Projekt als Präprozessordefinition BOOST_DISABLE_ASSERTS definiert. somit erscheint nun auch korrekt in assert.h#if defined(BOOST_DISABLE_ASSERTS)
# define BOOST_ASSERT(expr) ((void)0)
#elif defined(BOOST_ENABLE_ASSERT_HANDLER)
in blauer und nicht grauer schrift.
habe das ganze gelinkt, und komischerweise kommt die Assertion immer noch!!
wie kann den das sein?
gruss
-
Wenn du boost zwar im release modus kompilierst, aber die Header dann ja trotzdem im Debug modus eingebunden werden,
bleiben zumindest die Assertions in den Header aktuell.Anders kann ich mir es nicht erklären, wenn ihr wirklich korrekt gegen die Release libs linkt.