2009-11-16 10 views
53

Supongamos que tengo esta función:cómo crear punto de interrupción condicional con std :: string

std::string Func1(std::string myString) 
{ 
    //do some string processing 
    std::string newString = Func2(myString) 
    return newString; 
} 

¿Cómo se configura un descanso condicional cuando newString tiene un valor específico? (Sin cambiar la fuente)

establecer una condición newString == "my value"

no trabajar los puntos de interrupción obtuve de lesionados con un error de "operador sobrecargado no encontrado"

+0

No sé si esta es la intención, pero su código está roto. Func1 devuelve nulo, sin embargo, devuelve una cadena std ::. Func2 no se muestra, pero probablemente no devuelve una cadena std ::, además está utilizando el operador == (igual) en lugar de = (asignación). – falstro

+0

mal ejemplo de mi parte, corregido, pero el objetivo era ilustrar el problema de obtener un punto de interrupción condicional con std :: string para trabajar – Eli

Respuesta

39

un poco de búsqueda ha fallado a subir alguna manera de hacerlo esta. Las alternativas sugeridas son para poner la prueba en el código y añadir un punto de interrupción estándar:

if (myStr == "xyz") 
{ 
    // Set breakpoint here 
} 

O para construir su prueba de comparaciones de caracteres individuales. Incluso mirar personajes individuales en la cuerda es un poco arriesgado; en Visual Studio 2005 tuve que profundizar en las variables miembro como

myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z' 

Ninguno de estos enfoques es muy satisfactorio. Deberíamos tener un mejor acceso a una característica ubicua de la Biblioteca estándar.

+0

+1. Estaba escribiendo una respuesta similar. La única forma que conozco de hacer esto es echar un vistazo dentro de la implementación. Tenga en cuenta que para std :: string, esto puede ser bastante complicado debido a la optimización de cadenas cortas. –

+0

Esto tiene el problema de que 'myStr._Bx._Buf' solo es válido cuando' myStr._Mysize <_BUF_SIZE'. De lo contrario, debe utilizar 'myStr._Bx._Ptr' – RunHolt

8

Aunque he tenido que solucionar esto usando algo similar a la respuesta de Brad (además de usar DebugBreak() para romper directamente desde el código), algunas veces editar/recompilar/volver a ejecutar un código es demasiado lento o simplemente completamente imposible.

Afortunadamente, aparentemente es posible adentrarse en los miembros reales de la clase std :: string. Una forma es here mencionada - y aunque llama VS2010 específicamente, todavía puede acceder a caracteres individuales manualmente en versiones anteriores. Entonces, si está usando 2010, puede usar las funciones agradables strcmp() y similares (more info)), pero si es como yo y todavía tiene 2008 o antes, puede encontrar una alternativa irregular, terrible pero funcional por establecer un punto de interrupción algo condicional como:..

strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' && 
    strVar._Bx._Ptr[2] == 'c' 

a romperse si los tres primeros caracteres de strVar son "abc" se puede seguir adelante con caracteres adicionales, por supuesto feo .. pero me ha ahorrado un poco de tiempo solo ahora.

70

Hay una manera mucho más fácil en Visual Studio 2010/2012.

para lograr lo que busca en ANSI usar esto:

strcmp(newString._Bx._Ptr,"my value")==0 

Y en Unicode (si newString eran Unicode) usar esto:

wcscmp(newString._Bx._Ptr, L"my value")==0 

Hay más cosas que puede hacer que sólo una comparación, se puede leer más sobre esto aquí:

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-c-c-developers-using-string-functions-in-conditional-breakpoints.aspx

+0

Me gusta esta respuesta, funcionó para mí (con algunas excepciones donde la memoria no era accesible). – plucked

+21

Como han sugerido otros comentarios, el acceso a 'newString._Bx._Ptr' puede no funcionar para cadenas cortas. En mi caso obtuve "Intento de leer o escribir memoria protegida". Para cadenas cortas (¿16 caracteres o menos?), 'NewString._Bx._Buf' parece contener los caracteres. – vvnurmi

+2

Esta debería ser la respuesta aceptada. –

6

VS2012:

acabo de utilizar la condición de abajo porque newString._Bx._Ptr(as in OBWANDO's answer) referencia a la memoria ilegal

strcmp(newString._Bx._Buf, "my value")==0 

y funcionó ...

1

En VS2015 que puede hacer

newstring[0]=='x' && newString[1]=='y' && newString[2]=='z' 
3

En VS2017 usted puede hacer

strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0 
+1

Depende realmente del SDK de Windows que esté utilizando. Estoy usando 10.1.15068 con Visual Studio 2015 y esto funciona, mientras que string._Bx._Buf o string._Bx._Ptr no lo hacen. –

Cuestiones relacionadas