假设我有这个功能:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
当newString
具有特定值时,如何设置条件中断? (不改变来源)
设置条件newString == "my value"
没有工作断点被禁用,错误“找不到重载的操作符”
答案 0 :(得分:73)
Visual Studio 2010/2012中有一种更简单的方法。
要完成您在ANSI中寻找的内容,请使用:
strcmp(newString._Bx._Ptr,"my value")==0
在unicode中(如果newString是unicode)使用:
wcscmp(newString._Bx._Ptr, L"my value")==0
除了比较之外,你还可以做更多的事情,你可以在这里阅读更多相关内容:
答案 1 :(得分:44)
有些搜索未能以任何方式执行此操作。建议的替代方法是将测试放入代码中并添加标准断点:
if (myStr == "xyz")
{
// Set breakpoint here
}
或者从个人角色比较中建立你的测试。即使查看字符串中的单个字符也有点冒险;在Visual Studio 2005中,我不得不深入研究成员变量,如
myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
这些方法都不令人满意。我们应该能够更好地访问标准库中无处不在的功能。
答案 2 :(得分:9)
在VS2017中你可以做到
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
答案 3 :(得分:8)
虽然我不得不使用与Brad的答案类似的东西来解决这个问题(加上使用DebugBreak()来解决代码问题),但有时编辑/重新编译/重新运行一些代码也是时间太多了消费或者根本不可能。
幸运的是,显然有可能插入到std :: string类的实际成员中。提到了一种方法here - 虽然他特别指出了VS2010,但你仍然可以在早期版本中手动访问各个字符。因此,如果你使用的是2010年,你可以使用漂亮的strcmp()
函数等(more info),但如果你像我一样,仍然有2008年或更早,你可以想出一个通过设置断点条件,例如:
strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
strVar._Bx._Ptr[2] == 'c'
如果strVar中的前三个字符是“abc”则断开。当然,你可以继续使用额外的字符。丑陋......但是刚才我节省了一点时间。
答案 4 :(得分:8)
VS2012:
我刚刚使用了以下条件,因为newString._Bx._Ptr
( as in OBWANDO's answer )引用了非法内存
strcmp( newString._Bx._Buf, "my value")==0
它有效......
答案 5 :(得分:2)
@OBWANDO (almost) has the solution,但是正如正确地指出了多个注释,实际缓冲区取决于字符串大小;我认为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
答案 6 :(得分:2)
试图在strcmp
下的gdb8.1
中使用ubuntu18.04
,但无效:
(ins)(gdb) p strcmp("a", "b")
$20 = (int (*)(const char *, const char *)) 0x7ffff5179d60 <__strcmp_ssse3>
根据此answer strcmp
是一种特殊的IFUNC,可以设置以下条件:
condition 1 __strcmp_ssse3(camera->_name.c_str(), "ping")==0
这很丑陋,不想第二次这样做。
此answer提供了更好的解决方案,它使用了std::string::compare:
condition 1 camera->_name.compare("ping") == 0
答案 7 :(得分:1)
在VS2015中你可以做到
if (myPrinter != null) {
PrintServiceAttributeSet att =myPrinter.getAttributes();
for (Attribute a : att.toArray()) {
String attributeName;
String attributeValue;
attributeName = a.getName();
attributeValue = att.get(a.getClass()).toString();
String gh = (attributeName + " : " + attributeValue);
if (gh.equals("printer-is-accepting-jobs : not-accepting-jobs")) {
System.out.println("Printer Not Available");
}
if (gh.equals("queued-job-count : 0")) {
System.out.println("queued-job-count");
}
System.out.println(gh);
}
答案 8 :(得分:1)
比较字符串比比较字符更好
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'
答案 9 :(得分:1)
在VS2017中,我可以将条件设置为:
strcmp(&newString[0], "my value") == 0
答案 10 :(得分:0)
您可以使用c_str()
将其转换为c字符串,如下所示:
$_streq(myStr.c_str(), "foo")