如何使用std :: string创建条件断点

时间:2009-11-16 08:38:03

标签: visual-studio debugging conditional-breakpoint

假设我有这个功能:

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

newString具有特定值时,如何设置条件中断? (不改变来源)

设置条件newString == "my value"

没有工作断点被禁用,错误“找不到重载的操作符”

11 个答案:

答案 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 

除了比较之外,你还可以做更多的事情,你可以在这里阅读更多相关内容:

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

答案 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")