2008-08-28 6 views
7

Ich bin sicher, dass das schon passiert ist, etwas funktioniert im Debug-Modus, kompilieren Sie in Release, und etwas bricht.Die besten Möglichkeiten, einen Release-Modus zu debuggen

Das ist mir während der Arbeit an einer Embedded XP-Umgebung passiert, der beste Weg, den ich gefunden habe, war, eine Log-Datei zu schreiben, um festzustellen, wo es schiefgehen würde.

Was sind Ihre Erfahrungen/Entdeckungen, die versuchen, einen nervigen Release-Mode Bug zu beheben?

Antwort

0

Wenn nur ein kleiner Teil der Anwendung debuggt, können Sie diese Quelldateien ändern, um sie ohne Optimierung zu erstellen. Vermutlich generieren Sie Debug-Informationen für alle Builds. Dies führt dazu, dass die Anwendung größtenteils wie in der Version ausgeführt wird, Sie aber die interessanten Teile ordnungsgemäß debuggen können.

0

Wie wäre es mit Trace-Anweisungen. Sie sind dort für die Überprüfung des Freigabemodus.

3

Stellen Sie sicher, dass Sie über gute Debugsymbole verfügen (dies ist sogar mit einem Release-Build möglich, selbst auf Embedded-Geräten). Sie sollten in der Lage sein, einen Stack-Trace und hoffentlich die Werte einiger Variablen zu bekommen. Eine gute Kenntnis der Assemblersprache ist wahrscheinlich auch an dieser Stelle nützlich.

Meine Erfahrung ist, dass der Fehler im Allgemeinen mit Code in der Nähe der Bruchstelle verwandt ist. Das heißt, wenn Sie ein Problem in der Funktion "LoadConfigInfoFromFile" sehen, dann sollten Sie wahrscheinlich beginnen, dies für Probleme zu analysieren, anstatt "DrawControlsOnScreen", wenn Sie wissen, was ich meine. "Spooky Action auf Distanz" -Typ Bugs neigen nicht dazu, häufig aufzutreten (obwohl wenn sie es tun, neigen sie dazu, ein großer Bär zu sein).

0

Ich stimme dem Debuggen der Protokolldatei zu, um es einzugrenzen.

Ich habe "Funktionsname" "Funktionsname verlassen" verwendet, bis ich herausfinden kann, welche Methode es vor dem Absturz eingibt. Dann füge ich weitere Protokollnachrichten hinzu, kompiliere und veröffentliche sie erneut.

0

Neben dem Abspielen mit Ausschalten Optimierung und/oder Einschalten Debug-Informationen für Ihre Version Build als pauldoo sagte, eine Protokolldatei wird gute Daten wirklich helfen können. Ich schrieb einmal eine "Trace" -App, die Trace-Logs für die App erfassen würde, wenn sie beim Start des Release-Builds ausgeführt würde (andernfalls würden die Ergebnisse unter dem Debugger in das Ausgabefenster des Debuggers gelangen). Ich war in der Lage, Endanwender per E-Mail Log-Dateien von ihnen zu senden, die die Fehler wiedergaben, die sie sahen, und es war der einzige Weg, wie ich das Problem in mindestens einem Fall gefunden hätte.

0

Obwohl es wahrscheinlich nicht in einer eingebetteten Umgebung verwendbar ist, hatte ich viel Glück mit WinDbg zum Debuggen von Windows-Anwendungen Release-Modus. Selbst wenn die Anwendung nicht mit Symbolinformationen kompiliert wird, können Sie zumindest einen verwendbaren Stack-Trace und viele andere nützliche Absturzinformationen erhalten.

0

könnten Sie kopieren Ihre Debug-Symbole in der Produktionsumgebung, auch wenn es

in Relase-Modus kompiliert

Here ist ein Artikel mit mehr Informationen

0

Wenn Sie Problem Synchronisation Dumping Protokoll in der Datei könnte verwandt problematisch sein.
In diesem Fall werde ich normalerweise ein großes Array von Strings verwenden und dieses nach Bildschirm/Datei ausgeben, nachdem das Problem reproduziert wurde.
Dies hängt natürlich von Ihrer Speicherbeschränkung ab, manchmal verwende ich nur ein paar Symbole und Zahlen, um im Array zu speichern, wenn der Speicher auf der Plattform begrenzt ist. Das Lesen solcher Protokolle ist kein großes Vergnügen, aber manchmal ist dies die einzige Wahl.

2

Tracefile ist immer eine gute Idee. Wenn es um Abstürze geht, verwende ich adplus, das Teil der Debugging-Tools für Windows ist. Was Adplus eigentlich macht, ist, dass es windbg an die ausführbare Datei anfügt, die Sie überwachen. Wenn die Anwendung abstürzt, erhalten Sie einen Absturzabbild und eine Protokolldatei. Sie können den Crash-Dump in Ihren bevorzugten Debugger laden und herausfinden, welche Anweisung zu dem Absturz führte.

Da Release-Builds im Vergleich zu Debug-Builds stark optimiert sind, wirkt sich die Art und Weise, wie Sie den Code kompilieren, auf sein Verhalten aus. Dies ist im Wesentlichen der Fall, wenn Abstürze in Multithread-Code in der Release-Version auftreten, nicht aber in der Debug-Version. adplus und windbg haben mir geholfen, herauszufinden, wo das passiert ist.

ADPlus erklärt hier: httx: //support.microsoft.com/ scid = kb% 3Ben-us% 3B286350 & x = 15 & y = 12

Im Grunde, was Sie tun müssen, ist: 1. downloaden und installieren Sie WinDbg in C: \ debuggers httx: //www.microsoft.com/whdc/devtools/debugging/default.mspx

  1. Ihre Anwendung starten

  2. öffnen Sie eine cmd und cd c: \ debuggers

  3. Start adplus wie folgt aus:

"adplus.bat -crash your_exe.exe"

  1. reproduzieren den Absturz

  2. die crashdump in VS2005 analysieren oder in windbg