Ich habe mehrere Tage damit verbracht, meinen Inter-Thread-Semaphor-Sperrcode zusammen mit meinem DirectShow-Zeitstempel-Berechnungscode zu debuggen, der einige zutiefst frustrierende Probleme verursacht hat. Nachdem ich alle Fehler beseitigt hatte, die mir einfielen, hatte ich immer noch ein Problem mit Skype , an das meine Anwendung Audio sendet.
Nach ungefähr 10 Sekunden kam die Verzögerung zwischen meinem Sprechen und dem Hören meiner Stimme aus Skype auf dem zweiten PC, den ich zum Testen benutzte, dem fernen Ende des Anrufs, zu wachsen. Nach etwa 20 - 30 Sekunden begann die Verzögerung exponentiell zu wachsen und an diesem Punkt löste ich einen Code aus, der überprüft, ob ein kritischer Abschnitt zu lange gehalten wurde.
Glücklicherweise war es nicht zu spät in der Nacht, und nachdem ich das schon einmal durchgemacht hatte, entschied ich mich, unaufhörlich aufzuhören und den Großteil von OutputDebugString () abzuschalten. Zum Glück hatte ich die meisten von ihnen in eine bedingte Compiler-Definition eingebunden, so dass es einfach war. In dem Moment, als ich das tat, verschwanden die Probleme und es stellte sich heraus, dass mein Code gut funktionierte.
Es sieht also so aus, als ob die Delphi 6-IDE wirklich zugrunde geht, wenn der OutputDebugstring () - Datenverkehr über einem bestimmten Schwellenwert liegt. Vielleicht ist es nur die Aufgabe des Hinzufügens von Zeichenfolgen zum Ereignisprotokoll-Debuggerbereich, der alle OutputDebugString () - Berichte enthält. Ich weiß es nicht, aber ich habe in meinen Anwendungen ähnliche Probleme gesehen, wenn ein TMemo oder ein ähnliches Steuerelement zu viele Zeichenfolgen enthält.
Was haben die da draußen getan, um das zu verhindern? Gibt es eine Möglichkeit, das Ereignisprotokoll über einen Methodenaufruf zu löschen oder zumindest zu begrenzen? Welche Techniken verwenden Sie auch über bedingte Definitionen, IDE-Plug-Ins oder was auch immer, um mit dieser Situation fertig zu werden?
Ein ähnliches Problem ist mir zuvor bei Delphi 2007 passiert. Deaktivieren Sie die Ereignisanzeige in der IDE und verwenden Sie stattdessen DebugView von Sysinternals .
Ich benutze kaum OutputDebugString. Ich finde es schwierig, die Ausgabe in der IDE zu analysieren, und es erfordert zusätzlichen Aufwand, mehrere Sätze von mehreren Durchläufen zu behalten.
Ich bevorzuge eine gute Logging-Komponente (CodeSite, SmartInspect) und logge mich normalerweise in verschiedene Dateien ein. Standarddateien sind zum Beispiel "Allgemein", "Debug" (Standard-Debug-Informationen, die ich auch von einer Client-Installation sammeln möchte), "Konfiguration", "Dienste", "Clients". Diese sind alle so eingerichtet, dass sie zu einem Satz nummerierter Dateien "überlaufen". Dadurch können Sie die Protokolle mehrerer Läufe beibehalten, indem Sie einfach mehr nummerierte Dateien zulassen. Das Vergleichen von Log-Informationen aus verschiedenen Läufen wird dadurch viel einfacher.
In der Situation, die Sie beschreiben, würde ich Debug-Anweisungen hinzufügen, die in einer separaten Protokolldatei protokollieren. Zum Beispiel "Trace". Der Code, um "Trace" zur Verfügung zu stellen, liegt zwischen bedingten Definitionen. Das macht es ziemlich einfach.
Um zu vermeiden, dass diese zusätzlichen Debug-Anweisungen beibehalten werden, tendiere ich dazu, die Änderungen vorzunehmen, um das "Trace" -Log zu aktivieren, ohne es aus der Quellcodeverwaltung auszuchecken. Auf diese Weise verwirft der Compiler des Build-Servers "Identifizierer nicht definiert" -Fehler bei irgendwelchen Anweisungen, die unbeabsichtigt übrig geblieben sind. Wenn ich diese zusätzlichen Anweisungen behalten möchte, ändere ich sie entweder in das "Debug" -Log oder setze sie dazwischen bedingte definiert.
Das erste, was ich tun würde, ist sicherzustellen, dass das Problem das ist, was Sie denken, dass es ist. Es ist lange her, dass ich Delphi benutzt habe, daher bin ich mir nicht sicher über die IDE-Einschränkungen, aber ich bin ein wenig skeptisch, dass das Ereignisprotokoll mit der gleichen Anzahl von Debug-Strings im Laufe der Zeit exponentiell abstürzen wird in einem Zeitraum von 20-30 Sekunden geschrieben. Es scheint wahrscheinlicher, dass die Anzahl der geschriebenen Debug-Strings aus irgendeinem Grund im Laufe der Zeit zunimmt, was auf einen Fehler in Ihrem Anwendungssteuerungsfluss hindeuten könnte, der bei deaktivierter Protokollierung nicht so offensichtlich ist.
Um sicher zu gehen, würde ich versuchen, eine einfache Anwendung zu schreiben, die nur in einer Schleife läuft und Debug-Strings in Chunks von 100 oder so schreibt und die Zeit für jeden Chunk aufzeichnet, um zu sehen, ob die Zeit sich zu erhöhen beginnt signifikant über einen Zeitraum von 20-30 Sekunden.
Wenn Sie sicherstellen, dass dies das Problem ist - oder auch nicht - dann würde ich stattdessen eine Art Protokollierungsbibliothek empfehlen. OutputDebugString verliert wirklich seine Effektivität, wenn Sie es für massive Log-Dumps wie diese verwenden. Selbst wenn Sie eine Möglichkeit finden, das Ausgabefenster zurückzusetzen oder einzuschränken, würden Sie alle Protokolldaten verlieren.
IDE Fixpack hat eine Optimierung zur Verbesserung der Leistung von OutputDebugString
Die Debug-Log-Ansicht der IDE wurde ebenfalls optimiert. Der Debugger jetzt aktualisiert die Protokollansicht nur, wenn die IDE inaktiv ist. Dies ermöglicht die IDE zu Reaktiv bleiben, wenn Hunderte von OutputDebugString-Nachrichten oder andere Debug-Nachrichten werden in die Debug-Protokollansicht geschrieben.
Beachten Sie, dass dies nur für Delphi 2007 und höher gilt.
Tags und Links delphi debugging logging outputdebugstring