Was ist ein schneller Weg, um den Ein- und Ausstieg von Funktionen in einem Visual Studio 2005 c ++ Multithreading-Programm zu verfolgen?

StackOverflow https://stackoverflow.com/questions/238517

Frage

Ich habe unerwartete Abstürze in meinen ActiveMQ-Bibliotheken auftreten, aufgrund der Art, wie ich die activemq-CPP-API bin mit. Es wäre viel einfacher, das Problem zu debuggen, wenn ich jede Funktion wird genannt im Vorfeld des Absturz beobachten kann. Gibt es schnelle Wege, um die Ein- und Ausreise von Funktionen in einem Visual Studio 2005 c ++ Multithreading-Programm?

verfolgen

Vielen Dank im Voraus!

War es hilfreich?

Lösung

Verwenden Sie ein Tracer-Objekt. So etwas wie folgt aus:


class Tracer
{
public:
  Tracer(const char *functionName) : functionName_(functionName)
  {
    cout << "Entering function " << functionName_ << endl;
  }

  ~Tracer()
  {
    cout << "Exiting function " << functionName_ << endl;
  }

  const char *functionName_;
};

Jetzt können Sie einfach ein Tracer-Objekt an der Spitze instanziiert die Funktion, und es wird „Beenden ...“ automatisch drucken, wenn die Funktion beendet und der Destruktor aufgerufen werden:


void foo()
{
  Tracer t("foo");
   ...
}

Andere Tipps

Während der Debugger an einen Prozess angeschlossen ist, können Sie in den Quellcode der rechten Maustaste und wählen Sie „breakpoint-> hinzufügen Tracepoint“, mit dem Text, den Sie möchten (auch einige Makros werden mitgeliefert).

Die Tracepoint ist in der Tat ein Haltepunkt mit dem „When Hit“ Feld auf einiger Nachricht Druckerfunktionalität, und es bricht nicht tatsächlich den Prozess. Ich fand es mächtig nützlich: es auch eine Makro $ Funktion hat, die genau das tut, was Sie brauchen: drucken Sie die Funktion, die sie in ist (vorausgesetzt, es ist die Debug-Informationen verfügbar ... hat), und ein $ ThreadID

.

Alle oben genannten Optionen schön und kann Ihnen helfen. Aber ich kann nicht sehen, wie man mit der Maus TracePoing Einstellung können Sie für den Fall, helfen Sie Code Tausende von Funktionen haben.
Diese Art der Sache sollte Teil Ihrer regelmäßigen Programmierarbeit sein. Wenn Sie eine Funktion zu schreiben, sollten Sie überlegen, was Spuren Nachricht wird Ihnen helfen, es zu debuggen.
Sie müssen schreiben / vorhandene Logger verwenden, die in Abschnitt aufgespießt werden können (Leser-Thread, Worker-Thread, etc ...) und verschiedene Protokollebene (Fehler, Warnung, Spur, ausführlicher etc ..). Die guten Logger sollen in der Art und Weise gestaltet werden, dass es nicht Sie Performance schaden, dies in der Regel die Ausführlichkeit schaden, aber komplexe Synchronisationsprobleme können in der Regel wiedergegeben werden, wenn die Protokollierung ist sehr schnell, wie ein Zeichenfolge Zeiger auf den Array zuweisen, das nach dem Problem abgeladen werden kann wiedergegeben wird. Ich beginne in der Regel mit voller Spur Debuggen auf den Bildschirm geworfen und wenn ich Glück und Fehler reproduziert diese Weise zur Festsetzung der Fehler trivial ist, weil ich bereits genügend Informationen haben, beginnt der Spaß, wenn Problem verschwindet, und Sie müssen mit Ausführlichkeit spielen, um zu reproduzieren des Problems.
Ich finde eigentlich das Debuggen kreativer und befriedigender als Code schreiben, aber das ist nur mir.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top