Domanda

Supponiamo che io abbia questa funzione:

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

Come faccio a impostare una pausa condizionale quando newString ha un valore specifico? (Senza cambiare la sorgente)

impostando una condizione newString == "my value"

non ha funzionato i punti di interruzione preso disabili con un errore "operatore di overload non trovato"

È stato utile?

Soluzione

qualche ricerca è riuscito a girare su un modo per fare questo. alternative suggerite sono di mettere alla prova nel codice e aggiungere un punto di interruzione di serie:

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

O per costruire il test dai singoli confronti dei personaggi. Anche guardando i singoli caratteri nella stringa è un po 'rischiosa; in Visual Studio 2005 ho dovuto scavare nella variabili membro come

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

Nessuno di questi approcci è molto soddisfacente. Dovremmo avere un migliore accesso a una caratteristica onnipresente della libreria standard.

Altri suggerimenti

C'è un modo molto più semplice in Visual Studio 2010/2012.

Per fare quello che state cercando in ANSI utilizzare questo:

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

E in unicode (se fosse newString unicode) utilizzare questo:

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

Ci sono più cose che si possono fare di un semplice confronto, si può leggere di più qui:

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc -developers-utilizzando-string-funzioni-in-condizionale-breakpoints.aspx

In VS2017 si può fare

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

Mentre io ho avuto per ovviare a questo utilizzando qualcosa di simile alla risposta di Brad (più utilizzando DebugBreak () di rompere destra dal codice), a volte modifica / ricompilare / ri-esecuzione di un po 'di codice è troppo in termini di tempo o semplicemente impossibile.

Per fortuna, a quanto pare è possibile spelunk nelle utenti attuali della classe std :: string. Un modo è menzionato qui - e se lui chiama fuori VS2010 in particolare, è ancora possibile accedere ai singoli caratteri manualmente nelle versioni precedenti. Quindi, se si sta utilizzando il 2010, si può semplicemente utilizzare le belle funzioni strcmp() e simili ( + info) stringa-funzioni-in-condizionale-breakpoints.aspx -Studio-debugger-2010-funzione-per-CC-sviluppatori-con-, ma se siete come me e ancora 2008 o in precedenza, si può trovare con un raggedy, terribile, ma funzionale alternativa impostando un qualcosa condizionale punto di interruzione simile:

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

per rompersi se i primi tre caratteri in strVar sono "abc". Si può andare avanti con caratteri aggiuntivi, ovviamente. Brutto .. ma è mi ha salvato un po 'di tempo in questo momento.

VS2012:

Ho appena usato la condizione di seguito perché newString._Bx._Ptr (come nella risposta di OBWANDO) riferimento alla memoria illegale

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

e ha funzionato ...

@OBWANDO (quasi) ha la soluzione , ma come più commenti giustamente sottolineano, il buffer effettiva dipende dalla dimensione stringa; Vedo 16 ad essere la soglia. Anteponendo un controllo della dimensione della strcmp sulle opere buffer appropriati.

newString._Mysize < 16 && strcmp(newString._Bx._Buf, "test value") == 0

o

newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0

In VS2017, sono stato in grado di impostare la condizione come:

strcmp(&newString[0], "my value") == 0

In VS2015 si può fare

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

stringa Confrontando funziona meglio di confronto dei caratteri

strcmp(name._Mypair._Myval2._Bx._Buf, "foo")==0

Questo funziona, ma è molto scomodo da usare e soggetto a errori.

name._Mypair._Myval2._Bx._Buf[0] == 'f' && 
name._Mypair._Myval2._Bx._Buf[1] == '0' && 
name._Mypair._Myval2._Bx._Buf[2] == '0'
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top