как создать условную точку останова с помощью std:: string
Предположим, у меня есть эта функция:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
как установить условный перерыв, когда newString
имеет определенное значение ? (без изменения источника)
настройки состояния newString == "my value"
не работает точки останова отключены с ошибкой "перегруженный оператор не найден"
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
есть больше вещей, которые вы можете сделать, чем просто сравнить, вы можете прочитать больше об этом здесь:
в то время как мне пришлось обойти это, используя что-то похожее на ответ Брэда (плюс использование DebugBreak() чтобы вырваться прямо из кода), иногда редактирование/перекомпиляция/повторный запуск немного кода либо слишком много времени, либо просто невозможно.
к счастью, по-видимому, можно spelunk в фактические члены класса std:: string. Один из способов упоминается здесь -- и хотя он вызывает VS2010 специально, вы все еще можете получить доступ отдельные символы вручную в более ранних версиях. Поэтому, если вы используете 2010, Вы можете просто использовать nice 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
и это сработало...
@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'