как создать условную точку останова с помощью std :: string - PullRequest
62 голосов
/ 16 ноября 2009

Предположим, у меня есть эта функция:

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

как установить условный разрыв, если newString имеет определенное значение? (без изменения источника)

установка условия newString == "my value"

не работает точки останова отключены с ошибкой «перегруженный оператор не найден»

Ответы [ 9 ]

75 голосов
/ 04 марта 2013

В Visual Studio 2010/2012 есть гораздо более простой способ.

Чтобы выполнить то, что вы ищете в ANSI, используйте это:

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

И в Unicode (если newString был Unicode) используйте это:

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

Вы можете сделать больше вещей, чем просто сравнить, вы можете прочитать об этом здесь:

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

44 голосов
/ 08 декабря 2009

Некоторым поискам не удалось найти какой-либо способ сделать это. Предлагаемые альтернативы - поместить тест в ваш код и добавить стандартную точку останова:

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

Или создать свой тест из сравнений отдельных персонажей. Даже смотреть на отдельные символы в строке немного рискованно; в Visual Studio 2005 мне приходилось копаться в переменных-членах вроде

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

Ни один из этих подходов не является очень удовлетворительным. У нас должен быть лучший доступ к вездесущей функции Стандартной библиотеки.

9 голосов
/ 01 августа 2017

В VS2017 вы можете сделать

strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
8 голосов
/ 14 ноября 2013

VS2012:

Я просто использовал условие ниже, потому что newString._Bx._Ptr (как в ответе ОБВАНДО) ссылка на недопустимую память

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

и это сработало ...

8 голосов
/ 22 апреля 2011

Хотя мне пришлось обойти это, используя что-то похожее на ответ Брэда (плюс использование DebugBreak () , чтобы вырваться из кода), иногда редактируя / перекомпилируя / перезапуская немного кода или это слишком много времени или просто невозможно.

К счастью, по-видимому, можно вписаться в фактических членов класса std :: string. Здесь упоминается один из способов - и хотя он специально вызывает VS2010, вы все равно можете получить доступ к отдельным символам вручную в более ранних версиях. Так что, если вы используете 2010, вы можете просто использовать приятные strcmp() функции и тому подобное ( больше информации) , но если вы похожи на меня и у вас еще есть 2008 или более ранняя версия, вы можете придумать с неровной, ужасной, но функциональной альтернативой, установив условную точку останова, например:

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

для прерывания, если первые три символа в strVar - «abc». Конечно, вы можете продолжать использовать дополнительные символы. Ужасно ... но это сэкономило мне немного времени.

2 голосов
/ 11 июля 2018

@ OBWANDO (почти) имеет решение , но, как справедливо указывают несколько комментариев, фактический буфер зависит от размера строки; Я вижу 16, чтобы быть порогом. Работает проверка размера в strcmp в соответствующем буфере.

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

или

newString._Mysize >= 16 && strcmp(newString._Bx._Ptr, "ultra super long test value") == 0
1 голос
/ 16 июля 2018

Сравнение строк работает лучше, чем сравнение символов

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

Это работает, но очень неудобно в использовании и подвержено ошибкам.

name._Mypair._Myval2._Bx._Buf[0] == 'f' && 
name._Mypair._Myval2._Bx._Buf[1] == '0' && 
name._Mypair._Myval2._Bx._Buf[2] == '0'
1 голос
/ 05 мая 2017

В VS2015 вы можете сделать

newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
0 голосов
/ 05 июня 2019

В VS2017 я смог установить условие как:

strcmp(&newString[0], "my value") == 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...