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


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

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

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

настройки состояния newString == "my value"

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

8 58

8 ответов:

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

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 

и в 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

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

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

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

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

VS2012:

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

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

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

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

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

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

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

@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

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

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'