Wie kann ich verhindern, dass eine große Menge von OutputDebugString () -Aufrufen meine Anwendung in der Delphi 6-IDE verschlechtert?

8
Das ist mir mehr als einmal passiert und hat zu vielen verlorenen Stunden geführt, die einen Geist verfolgen. Als typisches Beispiel, wenn ich einen wirklich schwierigen Timing-Code debugge, fange ich an, Tonnen von OutputDebugString () -Aufrufen hinzuzufügen, damit ich ein gutes Bild von der Abfolge der damit verbundenen Operationen bekommen kann. Das Problem ist, dass die IDE von Delphi 6 nur so lange mit dieser Situation umgehen kann. Ich werde ein konkretes Beispiel verwenden, das ich gerade gemacht habe, um allgemeine (so viel wie möglich) zu vermeiden.

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?

    
Robert Oschler 03.12.2011, 18:23
quelle

4 Antworten

4

Ein ähnliches Problem ist mir zuvor bei Delphi 2007 passiert. Deaktivieren Sie die Ereignisanzeige in der IDE und verwenden Sie stattdessen DebugView von Sysinternals .

    
Sertac Akyuz 03.12.2011, 19:44
quelle
2

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.

    
Marjan Venema 03.12.2011 18:41
quelle
2

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.

    
Gerald 03.12.2011 19:02
quelle
1

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.

    
awmross 04.12.2011 22:49
quelle