31 Stimmen

Gibt es eine Möglichkeit, das Betreten bestimmter Funktionen in Visual Studio automatisch zu vermeiden?

Ich kenne die Debug-Option "Enable just my code", aber die funktioniert nur für verwalteten Code.

Ich bin auf der Suche nach einer Möglichkeit, in einen Funktionsaufruf zu treten, ohne zum Beispiel einen STL-String-Cast-Operator zu durchlaufen, weil es eine implizite Konvertierung von einem char* in einen String in einem der Parameter der Funktion gibt.

20voto

Ferruccio Punkte 96076

Ich fand dies Blogeintrag die eine Lösung hat. Obwohl ich es vorziehen würde, sagen zu können: "Betreten Sie nichts, was nicht Teil dieses Projekts ist", sieht dies praktikabel aus.

EDIT: Nachdem ich in einigen Blogs und Newsgroups nachgeschaut habe, besteht die Methode darin, unter diesem Registrierungsschlüssel einen Eintrag für jede Funktion hinzuzufügen, die Sie nicht betreten wollen (VS 2005 vorausgesetzt):

32 bit Windows \\HKEY_LOCAL_MACHINE\Software\Microsoft\VisualStudio\8.0\NativeDE\StepOver 64 bit Windows \\HKEY_LOCAL_MACHINE\Software\Wow6432Node\Microsoft\VisualStudio\8.0\NativeDE\StepOver

Versionsnummern für den Pfad:

Visual Studio 2005: 8.0
Visual Studio 2008: 9.0
Visual Studio 2010: 10.0
Visual Studio 2012: 11.0
Visual Studio 2013: 12.0

Dieser Schlüssel enthält eine Reihe von Regeln, die sich auf die Durchführung des Steppings auswirken. Jede Regel wird als separater Eintrag angegeben, dessen Name eine Dezimalzahl ist und dessen Wert ein Funktionsnamensmuster ist, das angibt, welche Funktionen wir beeinflussen wollen.

    "10" = "boost\\:\\:scoped\_ptr.\*\\:\\:.\*=NoStepInto"

verhindert das Eindringen in boost::scoped_ptr-Funktionen.

Die Regeln werden von hohen zu niedrigen Werten ausgewertet, bis ein passendes Muster gefunden wird oder keine Regeln mehr vorhanden sind. In diesem Fall wird in die Funktion eingetreten.

Funktionsnamen sind reguläre Ausdrücke.

Doppelpunkte müssen mit einem Backslash in Anführungszeichen gesetzt werden.

Sie können sowohl StepInto als auch NoStepInto angeben. Auf diese Weise können Sie vermeiden, dass Sie in alle bis auf einige wenige Funktionen im gleichen Bereich/Namensraum einsteigen.

Starten Sie Visual Studio neu, damit die Änderungen in der Registrierung übernommen werden.

3 Stimmen

Obwohl Visual Studio 2012 und 2013 in den obigen Details aufgeführt sind, wird die Registrierung NICHT mehr verwendet. Folgen Sie dem Link zum Blogeintrag, um zu erfahren, wie Sie default.natstepfilter aktualisieren können.

0 Stimmen

Ich glaube, die Registrierung wird in VS 2012 und 2013 verwendet, wenn Sie Bearbeiten und Fortfahren aktivieren.

6voto

Mark Ingram Punkte 68414

https://docs.microsoft.com/en-us/visualstudio/debugger/just-my-code?view=vs-2019#BKMK_CPP_Customize_stepping_behavior

In C++-Projekten können Sie die zu überspringenden Funktionen angeben, indem Sie sie als Nicht-Benutzer-Code in *.natstepfilter-Dateien auflisten. In *.natstepfilter-Dateien aufgeführte Funktionen sind nicht von den Just My Code-Einstellungen abhängig.

  • Um Nicht-Benutzer-Code für alle lokalen Visual Studio-Benutzer festzulegen, fügen Sie die Datei .natstepfilter zum %VsInstallDirectory%\Common7\Packages\Debugger\Visualizers Ordner.
  • Um Nicht-Benutzer-Code für einen einzelnen Benutzer festzulegen, fügen Sie die Datei .natstepfilter der Datei %USERPROFILE%\My Documents\<Visual Studio version>\Visualizers Ordner.

Eine .natstepfilter-Datei ist eine XML-Datei mit dieser Syntax:

<?xml version="1.0" encoding="utf-8"?>
<StepFilter xmlns="http://schemas.microsoft.com/vstudio/debugger/natstepfilter/2010">
    <Function>
        <Name>FunctionSpec</Name>
        <Action>StepAction</Action>
    </Function>
    <Function>
        <Name>FunctionSpec</Name>
        <Module>ModuleSpec</Module>
        <Action>StepAction</Action>
    </Function>
</StepFilter>

Element

Beschreibung

Funktion

Erforderlich. Gibt eine oder mehrere Funktionen als Nicht-Benutzerfunktionen an.

Name

Erforderlich. Ein ECMA-262-formatierter regulärer Ausdruck, der den vollständigen Funktionsnamen angibt, der übereinstimmen soll. Zum Beispiel:

<Name>MyNS::MyClass.*</Name>

teilt dem Debugger mit, dass alle Methoden in MyNS::MyClass als Nicht-Benutzer-Code zu betrachten sind. Die Übereinstimmung ist abhängig von der Groß- und Kleinschreibung.

Módulo

Optional. Ein nach ECMA-262 formatierter regulärer Ausdruck, der den vollständigen Pfad zu dem Modul angibt, das die Funktion enthält. Die Groß- und Kleinschreibung wird nicht beachtet.

Aktion

Erforderlich. Einer dieser zwischen Groß- und Kleinschreibung unterscheidenden Werte:

NoStepInto - weist den Debugger an, die Funktion zu durchlaufen.
StepInto - teilt dem Debugger mit, dass er in die Funktion einsteigen soll, wobei alle anderen NoStepInto für die entsprechende Funktion außer Kraft gesetzt werden.

0 Stimmen

Zumindest können Sie das tun, ich habe 4 Stunden damit verbracht, Python zu schreiben, damit lldb genau das tut

4voto

bayda Punkte 12869

Meine Copy-Past:

Vermeiden, in Dinge hineinzusteigen

Es ist oft sinnvoll, nicht auf die allgemeinen Code wie Konstruktoren oder überladene Operatoren zu vermeiden. autoexp.dat bietet diese Möglichkeit. Fügen Sie einen Abschnitt namens "[Ausführungssteuerung]". Fügen Sie Schlüssel hinzu, wobei der Schlüssel der Name der Funktion ist und der Wert "NoStepInto" ist. Sie können angeben ein Sternchen (*) als Platzhalter für die erste Gruppe von Doppelpunkten für einen Namespace oder Klasse.

autoexp.dat wird nur beim Start von Visual Start von Visual Studio gelesen.

Um die Funktion myfunctionname zu ignorieren, und alle Aufrufe der Klasse CFoo:

[ExecutionControl]

myfunctionname=NoStepInto

CFoo::*=NoStepInto

So ignorieren Sie Konstruktion und Zuordnung von MFC CStrings: (Beachten Sie das zusätzliche = in CString::operator=.)

[ExecutionControl]

CString::CString=NoStepInto

CString::operator==NoStepInto

Um alle ATL-Anrufe zu ignorieren:

[ExecutionControl]

ATL::*=NoStepInto

von diesem ( http://www.highprogrammer.com/alan/windev/visualstudio.html ) Artikel.

Sie können auch "Step Into Specific Function" aus dem Pupup-Menü verwenden.

bearbeiten Leider sieht es so aus, als ob die autoexp.dat in Vs 2003/2005 nicht funktioniert. Das gleiche können Sie mit den Registrierungseinstellungen tun. http://groups.google.com/group/microsoft.public.vsnet.debugging/browse_thread/thread/b03dee5a626470c0/26addb1b539883e8

0 Stimmen

Es sieht so aus, als ob die AUTOEXP.DAT-Datei nur in Visual Studio 6 unterstützt wird. Neuere Versionen verwenden Registry-Einträge.

4voto

Rob K Punkte 8547

Es gibt auch den Eintrag "Step into specific" im Kontextmenü, der die Funktionen auflistet, die in der aktuellen Zeile ausgeführt werden können, und Sie können die gewünschte Funktion auswählen.

2voto

Aaron Saarela Punkte 3816

VS6 erlaubte es, in der autoexp-Datei Werte zu definieren, die es erlaubten, häufige Funktionen (z.B. String-Konstruktoren) zu überspringen. Ab VS7 wurden diese Ausnahmen in die Registrierung verschoben. Die Benutzerfreundlichkeit leidet darunter sehr.

In VS7 und höher hat Microsoft in seiner Weisheit diese Ausschlüsse in die Registrierung verschoben. Hier sind einige Beispiele:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\9.0\NativeDE\StepOver]
"10"="CString\\:\\:CString=NoStepInto"
"11"=".*\\.c_str.*=NoStepInto"

Die Schlüsselnamen geben die Suchreihenfolge an. Die Schlüsselwerte enthalten die regulären Ausdrücke VS, nach denen gesucht werden soll.

Wenn Sie Ihre eigenen Ausnahmen erstellen, müssen Sie den Namen aus der Disassemblierungsansicht entfernen. Die Deklaration im Quelltext stimmt möglicherweise nicht mit dem vom Compiler generierten Namen überein, insbesondere bei Funktionen mit Schablonen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X