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

Eli*_*Eli 70 debugging conditional-breakpoint visual-studio

假设我有这个功能:

std::string Func1(std::string myString)
{
   //do some string processing 
   std::string newString = Func2(myString)
   return newString;  
}
Run Code Online (Sandbox Code Playgroud)

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

设定条件 newString == "my value"

没有工作断点被禁用,错误"找不到重载的运算符"

小智 76

Visual Studio 2010/2012中有一种更简单的方法.

要在ANSI中完成您正在寻找的内容,请使用以下命令:

strcmp(newString._Bx._Ptr,"my value")==0 
Run Code Online (Sandbox Code Playgroud)

在unicode中(如果newString是unicode)使用:

wcscmp(newString._Bx._Ptr, L"my value")==0 
Run Code Online (Sandbox Code Playgroud)

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

http://blogs.msdn.com/b/habibh/archive/2009/07/07/new-visual-studio-debugger-2010-feature-for-cc-developers-using-string-functions-in-conditional- breakpoints.aspx

  • 正如其他评论所暗示的那样,访问`newString._Bx._Ptr`可能不适用于短字符串.在我的情况下,我得到"尝试读取或写入受保护的内存".对于短字符串(16个字符或更少?),`newString._Bx._Buf`似乎包含字符. (22认同)
  • @Jounathaen 不幸在 VS 中不起作用:“这个表达式有副作用,不会被评估。” (2认同)

小智 44

有些搜索未能以任何方式执行此操作.建议的替代方法是将测试放在代码中并添加标准断点:

if (myStr == "xyz")
{
    // Set breakpoint here
}
Run Code Online (Sandbox Code Playgroud)

或者通过个性角色比较来建立测试.即使查看字符串中的单个字符也有点冒险; 在Visual Studio 2005中,我不得不深入研究成员变量

myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
Run Code Online (Sandbox Code Playgroud)

这些方法都不是非常令人满意.我们应该更好地访问标准库的无处不在的功能.

  • 此答案不再适用于较新的 Visual Studio。`strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0` 只是有效 (3认同)

Rai*_*Rai 27

在 VS2017 中,我能够将条件设置为:

strcmp(&newString[0], "my value") == 0
Run Code Online (Sandbox Code Playgroud)

  • 也适用于 VS2019,并且比所有其他答案更明显、更易读、更容易记住。 (2认同)

Adr*_*tos 13

在VS2017中你可以做到

strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
Run Code Online (Sandbox Code Playgroud)

  • 它实际上取决于您使用的Windows SDK.我使用10.1.15068与Visual Studio 2015,这是有效的,而string._Bx._Buf或string._Bx._Ptr不. (3认同)

Dou*_*dek 8

虽然我不得不使用类似于Brad的答案来解决这个问题(加上使用DebugBreak()从代码中解脱出来),但有时编辑/重新编译/重新运行一些代码要么太耗时,要么根本不可能.

幸运的是,显然可以插入到std :: string类的实际成员中.这里提到一种方法- 尽管他特别指出了VS2010,但你仍然可以在早期版本中手动访问各个字符.因此,如果您使用的是2010年,您可以使用不错的strcmp()功能等(更多信息),但如果您像我一样并且仍然拥有2008年或更早版本,那么您可以提出一个破旧,可怕但功能性的替代方案通过设置断点条件,例如:

strVar._Bx._Ptr[0] == 'a' && strVar._Bx._Ptr[1] == 'b' &&
   strVar._Bx._Ptr[2] == 'c'
Run Code Online (Sandbox Code Playgroud)

如果strVar中的前三个字符是"abc"则中断.当然,你可以继续使用额外的字符.丑陋..但它刚才给我节省了一点时间.


小智 8

VS2012:

我只是使用下面的条件,因为newString._Bx._Ptr (如在OBWANDO的回答中)引用了非法内存

strcmp( newString._Bx._Buf, "my value")==0
Run Code Online (Sandbox Code Playgroud)

它起作用了......