2009-03-18 22 views
5

Ich möchte eine Haltepunktbedingung zu meinem Code in VC++ Express 2005 hinzufügen, so dass der Haltepunkt nur ausgelöst wird, wenn eine lokale Variable ein bestimmtes Kriterium erfüllt. z.B.Wie Sie einen bedingten Haltepunkt in Visual C++ hinzufügen

bool my_test(UIDList test_list) { 
    foo(test_list); 
    bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0 
    print(test_list); 
} 

auf meinem Haltepunkt rechts geklickt habe und ausgewählt „Zustand ...“ Ich habe einen Dialog gefunden, das zu tun scheint, was ich will, aber alles, was ich eingeben versuche in das Textfeld führt zu dem folgenden Fehler:

Unable to evaluate the breakpoint condition: CX0052: Error: member function not present

Ich versuchte die Hilfe-Dokumentation, aber ich konnte meine Antwort nicht finden. Ich hoffe, jemand in VC++ Erfahrung könnte in der Lage sein, mich in die richtige Richtung zu zeigen ...

Ich habe zuvor versucht, auf eine neuere Version von VC++ Express zu aktualisieren, aber das Projekt wurde nicht sauber importiert. Aufgrund der Komplexität des Projekts und meiner aktuellen Zeitskalen kann ich an dieser Stelle kein Upgrade als Lösung betrachten.

Antwort

8

Verwenden Sie das DebugBreak(); Funktion:

bool my_test(UIDList test_list) { 
    foo(test_list); 
    if (bar(test_list) /* or whatever check :) */) // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0 
     DebugBreak(); 
    } 
    print(test_list); 
} 

Oder Sie immer behaupten können (Ausdruck)

bool my_test(UIDList test_list) { 
    foo(test_list); 
    bar(test_list); 
    assert(test_list.Length() > 0); // will break here 
    print(test_list); 
} 
4

Die Bedingungen in einem Haltepunkt können Methoden nicht aufrufen, soweit ich weiß. Also, was Sie tun müssen, ist die Länge vor der Hand zu berechnen. Etwas wie das.

 
 
bool my_test(UIDList test_list) { 
foo(test_list); 
int i = test_list.Length(); 
bar(test_list); // I have a breakpoint here, but only want it to trigger if test_list.Length() > 0 
print(test_list); 
} 
 

Setzen Sie einen bedingten Haltepunkt auf den Wert von i hier und Sie sollten in Ordnung sein.

10

VS hat einige Mikro-Auswertung Motoren- in variablen Uhrenfenster, sofortigen Fenster haben, zeigen Bedingungen brechen etc. Ich konnte nie finde eine anständige Dokumentation über sie. Soweit ich sagen kann, sind sie wählerisch über Methoden, die sie anrufen wollen, , aber sie sind auch unempfindlich gegenüber Zugriffsbeschränkungen.
So können Sie wahrscheinlich Ihre Bedingung von

test_list.Length() > 0 

um so etwas wie

test_list.m_nLength > 0 

(oder was auch immer Ihre private Länge var) umformulieren.

(EDIT) Gerade gefunden this msdn page zu erklären, welche Ausdrücke der Debugger kann und nicht umgehen kann. So zuerst, indeed -

'The debugger can access all class members regardless of access control. You can examine any class object member, including base classes and embedded member objects.'

Und zweitens, meine Vermutung in Bezug auf das Scheitern zu bewerten 'Länge()' - es war wahrscheinlich inlined:

'A debugger expression cannot call an intrinsic or inlined function unless the function appears at least once as a normal function.'

Verwandte Themen