2009-09-07 5 views
13

Ich habe ein ziemlich kompliziertes Makro in meinem (nicht verwalteten) C++ Code. Gibt es eine Möglichkeit, Makros in VS-Debugger zu erweitern? Oder gibt es eine andere Möglichkeit, Makros dort zu debuggen?Wie Makros in VS effizient debuggen?

F.e. Ich würde gerne einen Haltepunkt darin platzieren.

(Ja, ich weiß Makros schlecht sind.)

Antwort

16

Zum entweder Projekt oder Quelldatei Eigenschaften durch einen Rechtsklick und geht auf „Eigenschaften“. Setzen Sie unter Konfigurationseigenschaften-> C/C++ -> Präprozessor die Option "Vorverarbeitete Datei erstellen" entweder mit oder ohne Zeilennummern, je nachdem, was Sie bevorzugen. Dies zeigt, was Ihr Makro im Kontext erweitert. Wenn Sie es auf Live-kompilierten Code debuggen müssen, schneiden Sie es aus und fügen Sie es an Stelle Ihres Makros während des Debuggens ein.

+0

Habe ich gesagt, dass die Makros sehr kompliziert sind? Ich möchte nur ein oder zwei Ebenen erweitern, nicht alle Makros (sonst ist es einfach nicht lesbar) ... während des Debuggens. – liori

+2

Ja, es ist scheiße, aber es gibt keine gute Lösung, die ich kenne. Normalerweise muss ich mich dabei selbst ein wenig herumhacken, indem ich den Code entweder manuell ersetze, um die gewünschten Layer zu erhalten, oder über eine vollständig vorverarbeitete Datei. –

+0

@ JimBuck Ich kann scheinen nicht zu finden 'Preprocessed File generieren 'in Visual Studio 2013. – sami1592

4

Der Compiler erweitert schön Makros. Erhalten Sie eine Kompilierungsliste mit erweiterten Makros.

Fügen Sie das erweiterte Makro in Ihren Code ein. Erneut kompilieren und Sie sollten in der Lage sein, durchzugehen, , um einen einfachen Test zu machen.

Im Allgemeinen, wenn ich ein kompliziertes Makro, baue ich es hart Code zuerst und teste es. Dann mache ich daraus ein Makro.

Für das Jahr 2008 kann this hilfreich sein

+0

Ich konnte wirklich nicht finden, wie man die Makros automatisch erweitert. Ich weiß, dass ich das per Hand machen kann, aber ich erwarte, dass IDE das tun kann ... wie GDBs Erweiterungsbefehl. – liori

+0

Sie können einen C-Präprozessor für eine Quelldatei ausführen, um alle Makros zu erweitern. – n0rd

+0

Wenn Sie den Präprozessor separat ausführen, beachten Sie, dass er eine andere Vorstellung davon haben kann, welche Makros/Konstanten vordefiniert sind (insbesondere plattform-/compilerversionsspezifische). Ich bin davon gebissen worden! –

0

Gegen ein Übel mit einer Eviler-Methode. Erweitern Sie eine Instanz des Makros von Hand, bis Sie mit dem Debuggen fertig sind, oder das Dienstprogramm cpp kann Ihnen helfen, alle Makros zu erweitern, aber ich bin mir nicht sicher, ob es eine Windows-Version davon gibt.

0

Habe ich gesagt, dass die Makros sehr kompliziert sind? Ich möchte nur ein oder zwei Schichten erweitern, nicht alle Makros (sonst ist es deutlich lesbar) ... während des Debuggens

Wenn es nicht zu viele Makros sind Sie dies nicht tun wollen expandieren , dann können Sie sie einfach vor dem Snippet, das Sie debuggen möchten, vorgeben. Kompilieren Sie dann mit der [Generate Preprocessed File] wie oben erwähnt. Die Kompilierung wird fehlschlagen, aber Sie werden einen brauchbaren Ausschnitt in der vorverarbeiteten Ausgabe mit den richtigen Erweiterungen erhalten. Kopieren-Einfügen, entfernen Sie die # undef-s und debuggen.

Leider Ihre besten Freunde für mit C-Stil-Makros zu tun sind Inline, Vorlage und ein guter optimierenden Compiler.

+0

Ich versuche, bestehenden Code zu grok, nicht neu zu schreiben. Inlines und Templates werden mir hier nicht weiterhelfen. – liori

0

Verwenden Sie Inline-Funktionen (zwingen Sie Inlining, wenn Sie es wirklich meinen) und bleiben Sie dabei! Dies wird effizienter (erhalten Sie nur inline, wenn es Leistung bringt, wenn Sie für Perf optimieren) und wartbar. Sie verlieren viel durch die Verwendung von Makros: Typprüfung & Sicherheit.

Makros existieren nicht für den Compiler, sie tun nur für den Präprozessor. Dieser macht Textersetzungen, ohne nach Nebenwirkungen zu suchen. Also Makros werden eigentlich nie aufgerufen und Sie können nicht in ihnen debuggen. Egal wie Sie ein Makro programmieren, Missbrauch ist immer möglich. Wie in diesem Beispiel:

#define SQUARE(a) ((a)*(a)) 

Hinweis bereits die ( `) 'zum Schutz gegen Ersatz wie SQUARE (3 + 2).Aber sie schützen nicht vor:

Man würde erwarten, dass es 4 sein wird, aber Sie am Ende mit 6, die nicht wirklich quadratisch ist. Wenn es auf int b = (++a)*(++a); erweitert wird, hätten Sie keine Probleme mit Inlinefunktionen.

Beachten Sie, dass die Implementierung einer Inlined-Funktion für den Compiler an den Stellen sichtbar sein muss, an denen Sie ihn verwenden. Auch das Debuggen wird für den unerfahrenen Benutzer merkwürdig sein: Da es viele Instanzen einer Inlinefunktion gibt, erhalten Sie eine riesige Liste von Methoden, wenn Sie beispielsweise den Ausführungspunkt an einen anderen Ort verschieben möchten.

+2

Ich bin gut über die schlechten und guten Seiten von Makros informiert. -1 – liori

0

Ja, Sie können.

Suchen Sie die vorverarbeiteten Datei vom Präprozessor erzeugt im Debug-Ordner.

Also, wenn Ihr Makro testing.c Datei geschrieben ist, würde die vorverarbeiteten Datei Sie können testing.i

Es aufgerufen werden sehen, wie das Makro erweitert wurden.

es zu debuggen, kopieren Sie einfach diesen Code einfügen, um Ihre :)

2

Wenn Sie den erweiterten Code durch den Präprozessor erzeugt, um zu sehen, dann können Sie es den -E-Flag erhalten mit gcc verwenden. Der Befehl würde wie folgt sein:

$ gcc -E <source code> -o <preprocessed file name> 

Sie können den ursprünglichen Quellcode unter Verwendung von Makro mit dem erweiterten Code und Ort unabhängig von Bruchstelle, die Sie dort platzieren mögen ersetzen.

+1

Ich weiß, das war, was ich zu der Zeit tat. Aber die Vorverarbeitung des Microsoft-Compilers ist etwas anders - für ein Beispiel siehe http://social.msdn.microsoft.com/Forums/en-US/3f682bf-8421-474a-aa38-e32f9a0b728f/difference-between-microsoft-visual-studio -preprocessor-und-gccs; Außerdem wollte ich wirklich keine zusätzlichen Tools verwenden, das ist eine lästige Pflicht, sie einem ganzen Team vorzustellen. – liori

3

Ich lernte von http://www.codeproject.com/Tips/320721/Macro-expansion-in-VCplusplus die beste Möglichkeit zum Debuggen von Makros.

Und ich tun, was ist eine cxx-Datei erstellen namens „test.cxx“ und innen i nur das Makro gesetzt und ein einige verwendet Beispiel eines test.cxx:

#define GetMacro(param1) \ 
    public: void Get##param1(){ return m_##param1; } 

GetMacro(MyVariable); 

und in einer Befehlszeile i eingeben:

c:\ cl /EP test.cxx > output.cxx 

Wenn ich die output.cxx Datei öffnen, sollte es einige Leerzeilen sein und am unteren Rand der erweiterten Makro, wie:

public: void GetMyVariable(){ return m_MyVariable; }; 

Sie können Makros ohne Kompilierung testen und das macht es schnell.

3

hörte ich alle möglichen negativen Antworten zum Thema:

  • Makros können nur nicht ausgewertet
  • Präprozessor Include-Dateien analysieren kann auch
  • verschachtelte Makros
  • abhängig gemacht werden zu kompliziert erweitert werden Vorverarbeitung kann schwierig sein
  • Makros sind böse, nur vermeiden sie
  • usw. etc ....

Sie sind alle wahr, aber IMO kollidieren sie mit der Realität der Programmierung jeden Tag.

In der Tat, bei der Arbeit am alten C-Projekt, bei dem Makros hauptsächlich einfach als Funktionen verwendet wurden, wurde dies für mich von entscheidender Bedeutung. Das Generieren aller vorverarbeiteten Dateien mit/P funktioniert, ist jedoch übermäßig und zeitaufwendig. Ich brauchte nur ein Werkzeug, das ein einfaches Makro erweitert, das einige Zeilen über oder maximal in einer anderen Datei definiert ist.

Wie geht das?

  1. Unter Linux verwenden Sie einfach GDB und seine Makros erweitern Fähigkeiten
  2. Unter Windows verwende ich https://www.jetbrains.com/resharper-cpp/ integriert in Visual Studio

Also, ja, im praktischen Sinne, es ist möglich.

0

Wenn Sie Visual Studio verwenden, um an C- oder C++ - Projekten zu arbeiten, die Makros verwenden, erhalten Sie Resharper for C++ (ich glaube, dass es eine Testversion gibt). Es erlaubt Ihnen, auf ein Makro zu klicken und es vollständig oder stufenweise zu erweitern. Wir haben einige extrem komplizierte, verschachtelte Makros und es ist die einzige Möglichkeit, sie zu verstehen.