2009-03-18 16 views
5

Desidero aggiungere una condizione di punto di interruzione al mio codice in VC++ Express 2005, in modo che il punto di interruzione si attivi solo se una variabile locale soddisfa un criterio specificato. per esempio.Come aggiungere un punto di interruzione condizionale in Visual C++

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); 
} 

Dopo aver cliccato il tasto destro del sul mio punto di interruzione e selezionato "Condizione ..." Ho trovato una finestra di dialogo che appare a fare quello che voglio, ma niente provo a digitare nei risultati dei campi di testo il seguente errore:

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

Ho provato la documentazione di aiuto, ma non ho trovato la mia risposta. Spero che qualcuno esperto in VC++ possa essere in grado di indicarmi la giusta direzione ...

Ho già provato l'aggiornamento a una versione più recente di VC++ Express, ma il progetto non è stato importato in modo pulito. A causa della complessità del progetto e delle mie attuali scale temporali, non posso considerare l'aggiornamento come soluzione a questo punto.

risposta

8

utilizzare il DebugBreak(); Funzione:

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); 
} 

Oppure si può sempre usare assert (espressione)

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

Le condizioni in un punto di interruzione non possono chiamare metodi per quanto ne so. Quindi, quello che devi fare è calcolare la lunghezza prima della mano. Qualcosa come questo.

 
 
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); 
} 
 

mettere un punto di interruzione condizionale sul valore dei qui e si dovrebbe andare bene.

10

VS ha alcuni posti dei motori di micro-valutazione nelle finestre di orologi variabili, finestra immediata, rompere condizioni point ecc potrei mai trova documentazione decente su di loro. Per quanto posso dire sono pignoli sui metodi che sono disposti a chiamare, ma sono anche insensibili alle limitazioni di accesso.
Quindi, probabilmente si può riformulare la sua condizione da

test_list.Length() > 0 

a qualcosa di simile

test_list.m_nLength > 0 

(o qualunque sia la vostra lunghezza di private var è).

(EDIT) Ha trovato lo this msdn page che spiega quali espressioni il debugger può e non può gestire. Quindi, prima, 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.'

E in secondo luogo, la mia ipotesi per quanto riguarda il fallimento di valutare 'Lunghezza()' - E 'stato probabilmente inline:

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

Problemi correlati