как создать условную точку останова с помощью std::string

StackOverflow https://stackoverflow.com/questions/1740858

Вопрос

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

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

И в юникоде (если newString была юникодом) используйте это:

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

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

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

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

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

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

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

ВС2012:

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

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

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

у @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

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

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

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

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

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

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'
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top