Załóżmy, że mam taką funkcję:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
jak ustawić przerwanie warunkowe, gdy newString
ma określoną wartość? (bez zmiany źródła)
ustawienie warunku newString == "my value"
nie działa punkty przerwania zostały wyłączone z błędem „nie znaleziono przeciążonego operatora”
Odpowiedzi:
Niektóre wyszukiwania nie znalazły żadnego sposobu, aby to zrobić. Sugerowane alternatywy to umieszczenie testu w kodzie i dodanie standardowego punktu przerwania:
Lub zbuduj swój test na podstawie indywidualnych porównań postaci. Nawet patrzenie na poszczególne znaki w ciągu jest nieco ryzykowne; w Visual Studio 2005 musiałem zagłębić się w zmienne składowe, takie jak
Żadne z tych podejść nie jest zbyt zadowalające. Powinniśmy mieć lepszy dostęp do wszechobecnej funkcji Biblioteki Standardowej.
źródło
myStr._Bx._Buf
jest ważny tylko wtedy, gdymyStr._Mysize < _BUF_SIZE
. W przeciwnym razie musisz użyćmyStr._Bx._Ptr
strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0
po prostu działaW programie Visual Studio 2010/2012 jest znacznie łatwiejszy sposób.
Aby osiągnąć to, czego szukasz w ANSI, użyj tego:
A w unicode (jeśli newString było unicode) użyj tego:
Jest więcej rzeczy, które możesz zrobić niż tylko porównanie, możesz przeczytać więcej na ten temat tutaj:
http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc-developers-using-string-functions-in-conditional- breakpoints.aspx
źródło
newString._Bx._Ptr
może nie działać dla krótkich ciągów. W moim przypadku otrzymałem komunikat „Próbowano odczytać lub zapisać chronioną pamięć”. W przypadku krótkich ciągów (16 znaków lub mniej?),newString._Bx._Buf
Wydaje się, że zawiera znaki.strcmp(newString.c_str(), "my_value") == 0
. Może wymagać więcej wewnętrznych obliczeń, ale nie jest łatwiejsze do zapamiętania.W VS2017 możesz to zrobić
źródło
W VS2017 mogłem ustawić warunek jako:
źródło
Chociaż musiałem to obejść, używając czegoś podobnego do odpowiedzi Brada (plus używając DebugBreak (), aby oderwać się od kodu), czasami edycja / ponowna kompilacja / ponowne uruchomienie fragmentu kodu jest albo zbyt czasochłonne, albo po prostu niemożliwe .
Na szczęście najwyraźniej możliwe jest dodanie do rzeczywistych elementów klasy std :: string. Wspomniano tutaj o jednym sposobie - i chociaż przywołuje on szczególnie VS2010, nadal możesz uzyskać dostęp do poszczególnych znaków ręcznie we wcześniejszych wersjach. Więc jeśli używasz 2010, możesz po prostu użyć fajnych
strcmp()
funkcji i tym podobnych ( więcej informacji) , ale jeśli jesteś podobny do mnie i nadal masz rok 2008 lub wcześniej, możesz wymyślić obskurną, okropną, ale funkcjonalną alternatywę ustawiając warunek punktu przerwania, na przykład:do przerwania, jeśli pierwsze trzy znaki w strVar to „abc”. Oczywiście możesz kontynuować z dodatkowymi znakami. Brzydkie ... ale teraz zaoszczędziło mi to trochę czasu.
źródło
VS2012:
Właśnie użyłem poniższego warunku, ponieważ
newString._Bx._Ptr
(jak w odpowiedzi OBWANDO) odwołałem się do nielegalnej pamięcii zadziałało ...
źródło
@OBWANDO (prawie) ma rozwiązanie , ale jak słusznie wskazuje wiele komentarzy, rzeczywisty bufor zależy od rozmiaru ciągu; Widzę 16 jako próg. Wstawienie sprawdzenia rozmiaru do strcmp w odpowiednim buforze działa.
lub
źródło
Próbowałem użyć
strcmp
wgdb8.1
underubuntu18.04
, ale to nie działa:Zgodnie z tą odpowiedzią ,
strcmp
jest specjalnym IFUNC , można ustawić taki warunek:To dość brzydkie, nie chcę tego robić po raz drugi.
Ta odpowiedź daje znacznie lepsze rozwiązanie, używa std :: string :: compare :
źródło
W VS2015 możesz to zrobić
źródło
Porównywanie ciągów działa lepiej niż porównywanie znaków
To działa, ale jest bardzo niewygodne w użyciu i podatne na błędy.
źródło
Możesz przekształcić go w ciąg ac, używając w ten
c_str()
sposób:$_streq(myStr.c_str(), "foo")
źródło