467 Stimmen

Kann ich herausfinden, den Rückgabewert vor der Rückkehr während des Debuggens in Visual Studio?

Nehmen Sie die folgende Funktion:

DataTable go() {
    return someTableAdapter.getSomeData();
}

Wenn ich in dieser Funktion einen Haltepunkt setze, gibt es dann eine Möglichkeit, den zurückgegebenen Wert zu überprüfen? go() ist direkt mit einer Datentabelle in einer .aspx Seite.

Die einzige Möglichkeit, die zurückgegebene Datentabelle zu überprüfen, ist die Verwendung einer temporären Variablen. Das ist jedoch etwas umständlich. Gibt es keine andere Möglichkeit?

2 Stimmen

Sie können eine Überwachung hinzufügen, wenn Sie im Aufrufstapel nach oben gehen

0 Stimmen

Früher konnte man das in VB6 machen, wenn ich mich recht erinnere. Aber damals bestand die Syntax für Funktionen darin, den Wert der Funktion auf den Rückgabewert zu setzen...

5 Stimmen

Kommentar für Visual C++-Benutzer: Geben Sie $ReturnValue in das Immediate Window oder das Watch Window ein. Zumindest bei meinem VS 2010 hat es funktioniert!

5voto

doekman Punkte 18062

Es gibt eine Reihe von Umgehungsmöglichkeiten, aber keine scheint zufriedenstellend zu sein.

Um John Skeet unten zu zitieren (Kommentar zu einer inzwischen gelöschten Antwort):

Sieht für mich immer noch unpraktisch aus - besonders wenn man nicht weiß, welche Rückgabewert Sie brauchen werden benötigen, bevor Sie mit der Fehlersuche beginnen. Ich möchte wirklich möchte nicht jedes Mal eine temporäre Variable Variable haben, die meinen Code bei jedem wenn ich jemals etwas zurückgebe.

Theoretisch könnte der Debugger eine return -Variable. Schließlich handelt es sich nur um eine Variable auf dem Stapel:

unsafe {
  int * sp = stackalloc int[1];
  try {
    return a+b;
  }
  finally {
    Trace.WriteLine("return is " + *(sp+3));
  }
}

Betrachten Sie dies also als eine Funktionsanfrage für Visual Studio.

0 Stimmen

Es besteht ein großer Unterschied zwischen einer Variablen (einer wohldefinierten lokalen Variable) und einem Wert auf dem Stack. Es ist ein Wert auf dem Stack, aber es ist keine Variable (=lokal).

0 Stimmen

@Marc: Ich bin mir nicht sicher, wie die CLR funktioniert, aber viele Compiler legen Funktionsargumente auf dem Stack unterhalb des Stackpointers (sp) ab und lokale Variablen auf dem Stack oberhalb des Stackpointers. Das ist genau das, was ich zu zeigen versuche. Und OK, wenn der Rückgabewert ein Referenztyp ist, erhalten Sie einfach einen Zeigerwert.

1 Stimmen

Es liegt nicht unbedingt auf dem Stapel. Wenn Sie sich Debug -> Registers ansehen, werden Sie es in EAX sehen

5voto

splttingatms Punkte 321

Ich wollte das Thema erweitern PascalK's Antwort um dies in Visual Studio 2015 zum Laufen zu bringen, denn es gibt eine versteckte Funktion, die nicht in Untersuchung der Rückgabewerte von Methodenaufrufen .

Wenn Sie verschachtelte Funktionsaufrufe haben, werden die Pseudovariablen $ResultValueX werden automatisch erstellt, wobei sich das X auf die Reihenfolge der Funktionsaufrufe bezieht. Wenn Sie also einen Aufruf wie den folgenden haben Multiply(Five(), Six()) werden die folgenden Pseudovariablen erstellt:

Five()     | $ResultValue1 = 5
Six()      | $ResultValue2 = 6
Multiply() | $ResultValue3 = 30

2voto

Sprintstar Punkte 7700

Microsoft Visual C++ hat dies früher getan, aber Visual Studio tut dies nicht, soweit ich weiß :(

2voto

Sylvain Rodrigue Punkte 4516

Die einzige Möglichkeit, die ich kenne, ist, einen Haltepunkt auf der Rückgabezeile zu setzen und dann die Schnellsuche und geben Sie den zurückgegebenen Ausdruck ein:

someTableAdapter.getSomeData();

Dies funktioniert jedoch nur, wenn der Aufruf den Zustand eines Objekts nicht verändert (da es einen zweiten Aufruf derselben Methode geben wird, wenn Sie die Ausführung fortsetzen).

5 Stimmen

Dies funktioniert auch nur, wenn Ihr Ausdruck keine Lambdas enthält.

2voto

GeekyMonkey Punkte 11711

Das Öffnen des Fensters Debug-Autos bringt Sie in die Nähe. Es zeigt nicht den tatsächlichen Rückgabewert, aber es zeigt, was in der Rückgabeanweisung ausgewertet wurde.

2 Stimmen

Ich konnte nicht erreichen, dass das VS2008-Auto-Fenster so etwas anzeigt. Könnten Sie bitte klären?

0 Stimmen

return x + y; Was ich meinte, war, wenn Sie einen Haltepunkt in dieser Zeile setzen, zeigt Ihr Debug-Autos-Fenster die aktuellen Werte für x und y an. Wie ich schon sagte, bringt es Sie nur in die Nähe. Ich wollte nur hilfreich sein. Ich denke nicht, dass das eine Abwertung verdient.

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