2009-03-18 38 views
5

Quiero agregar una condición de punto de interrupción a mi código en VC++ Express 2005, de modo que el punto de interrupción solo se active si una variable local cumple un criterio especificado. p.ej.Cómo agregar un punto de interrupción condicional en 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); 
} 

Habiendo hace clic derecho en mi punto de interrupción y seleccionado "Condición ..." He encontrado un cuadro de diálogo que aparece al hacer lo que quiera, sin embargo todo lo que intento escribir en los resultados del campo de texto en el siguiente error:

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

He intentado con la documentación de ayuda, pero no he podido encontrar mi respuesta. Espero que alguien con experiencia en VC++ pueda orientarme en la dirección correcta ...

He intentado actualizar anteriormente a una versión más reciente de VC++ Express, pero el proyecto no se importó limpiamente. Debido a la complejidad del proyecto y mis escalas de tiempo actuales, no puedo considerar la actualización como una solución en este momento.

Respuesta

8

use el DebugBreak(); Función:

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

O usted puede utilizar siempre afirman (expresión)

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

Las condiciones en un punto de interrupción no pueden llamar a los métodos hasta donde yo sé. Entonces, lo que necesita hacer es calcular la longitud antes de la mano. Algo como esto.

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

Deja un punto de interrupción condicional en el valor de i aquí y que debe estar bien.

10

VS tiene cierta Motores- micro-evaluación en las ventanas de reloj variable, ventana inmediata, romper las condiciones puntuales, etc. Nunca pude encontrar documentación decente sobre ellos. Hasta donde puedo decir que son exigentes con los métodos a los que están dispuestos a llamar, pero también son insensibles a las limitaciones de acceso.
Por lo tanto, es probable que pueda reformular su condición de

test_list.Length() > 0 

a algo así como

test_list.m_nLength > 0 

(o lo que su longitud es private var).

(EDIT) Acaba de encontrar this msdn page explicando qué expresiones puede y qué no puede resolver el depurador. Así que, primero, 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.'

Y en segundo lugar, mi suposición en cuanto a la falta de evaluación 'Longitud()' - Fue probablemente entre líneas:

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

Cuestiones relacionadas