2009-06-07 8 views
1

Ich habe einige Probleme mit einem der Projekte, die ich an Windows (64 Bit) arbeite. Das Programm stürzt manchmal ab, manchmal nicht, und ich vermute, dass das Problem mit mehreren verknüpften C-Runtime verbunden ist. Wie kann ich dies unter Windows erkennen? Ich versuchte mit depends.exe, aber es berichtete nicht das CRTErkennen von mehreren verknüpften C-Laufzeit unter Windows

+0

Wo ist der Absturz? Hast du einen Stack-Trace oder sowas? – Macke

+0

Irgendwo tief in der C-Laufzeit, ohne Stack-Spur, leider ... –

Antwort

3

Es ist ziemlich unwahrscheinlich, dass Sie erfolgreich statisch mit mehreren C-Laufzeitbibliotheken verbinden konnten - Sie würden in viele Symboldefinitionskonflikte laufen, die mindestens voluminöse Warnungen produzieren würden, und nur ein rücksichtsloser Ingenieur würde sie ignorieren.

Mit depends würde ich sicherstellen, dass die dynamische Profilierungsoption verwendet wird, um alle Abhängigkeiten für dynamische CRTLs zu überprüfen, die sie laden. Wenn nichts auftaucht, vermute ich, dass Ihr Problem woanders ist.

Ich würde vermuten, Ihr Problem ist woanders in jedem Fall, wie DLLs mit C-Level-APIs sollten in der Regel auf gemeinsam genutzte Zustand in der CRTL - am häufigsten der Speicherzuordner - und sollte übernehmen ein standardisiertes Protokoll für die API-übergreifende Speicherverwaltung, wie z. B. Anruferzuweisungen, Angerufener oder Weiterleitung von Speicherzuweisungsrückrufen usw. Mit anderen Worten, mehrere CRTLs in demselben Prozess sind normalerweise aufgrund der korrekten Verwendung von a kein Problem Speicherverwaltungsprotokoll.

Für vorübergehende Fehler würde ich Multithreading oder Heap-Korruption vermuten.

+0

Ich werde in der dynamischen Profilerstellung Option, danke In Bezug auf den gemeinsamen Status von CRLT, ich glaube nicht, dass ich nichts dagegen tun kann. Es ist für eine Python-Erweiterung und ich kontrolliere einfach nichts auf dem Speicherzuweisungsteil (refcounting). Ich bin überrascht von Ihrer Behauptung, dass mehrere CRT kein Problem sind - ich bin weit entfernt von einem Windows-Spezialisten, aber ich habe konsequent gelesen, dass es aus vielen Quellen vermieden werden sollte. Ich verstehe, dass dies vermieden werden kann, indem man vorsichtig ist, aber ich denke nicht, dass dies in meinem Fall machbar ist (da ich nicht jeden Teil der endgültigen ausführbaren Datei kontrolliere). –

+0

In den meisten Fällen, in denen Sie eine DLL unter Windows verwenden, verfügen Sie nicht über die Quelle und können nicht steuern, welche Laufzeitbibliothek sie verwendet. Es ist nicht wie Linux, wo es die GNU C-Bibliothek gibt, und jede gemeinsam genutzte Bibliothek kann (normalerweise) darauf vertrauen, dass malloc im Prozess zu demselben Zuordner aufgelöst wird. Darüber hinaus können DLLs in verschiedenen Sprachen geschrieben werden; Eine Pascal-DLL, die in einer C-EXE oder umgekehrt verwendet wird, kann Laufzeitbibliotheken nicht gemeinsam nutzen, da sie andere Anforderungen haben. Daher muss eine Speicherverwaltungskonvention oder ein Speicherverwaltungsprotokoll befolgt werden. –

+0

Ich habe es schließlich geschafft, eine Stack-Trace zu bekommen, und das Problem ist in der Tat eine FILE * über DLL-Grenzen übergeben. Ich denke also, dass ich irgendwie darauf verzichten muss. Würdest du irgendeine Referenz bezüglich des Protokolls für DLL-Grenzen auf Windows wissen? Ich bin mit der Sache wirklich nicht vertraut, und ich fürchte, ich werde mich an mehreren Stellen in den Codebasen, an denen ich arbeite, damit befassen müssen. –