89

假设我有这个功能:

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

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

设定条件 newString == "my value"

没有工作断点因错误“未找到重载运算符”而被禁用

4

12 回答 12

93

在 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-cc-developers-using-string-functions-in-conditional-断点.aspx

于 2013-03-04T07:49:50.403 回答
50

一些搜索未能找到任何方法来做到这一点。建议的替代方法是将测试放在代码中并添加标准断点:

if (myStr == "xyz")
{
    // Set breakpoint here
}

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

myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'

这些方法都不是很令人满意。我们应该可以更好地访问标准库的普遍功能。

于 2009-12-08T00:04:35.230 回答
36

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

strcmp(&newString[0], "my value") == 0
于 2019-06-05T11:16:18.733 回答
21

在 VS2017 中你可以做

strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
于 2017-07-31T22:05:46.957 回答
8

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

幸运的是,显然可以深入研究 std::string 类的实际成员。这里提到了一种方法——尽管他特别提到了 VS2010,但您仍然可以在早期版本中手动访问单个字符。因此,如果您使用的是 2010,您可以只使用不错的strcmp()功能等(更多信息),但如果您像我一样仍然拥有 2008 或更早版本,您可以想出一个粗糙、糟糕但功能强大的替代方案通过设置断点条件,例如:

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

如果 strVar 中的前三个字符是“abc”,则中断。当然,您可以继续使用其他字符。丑陋..但它刚刚为我节省了一点时间。

于 2011-04-22T16:18:23.890 回答
8

VS2012:

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

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

它奏效了……

于 2013-11-13T21:12:01.380 回答
3

@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
于 2018-07-11T09:29:26.987 回答
2

尝试strcmpgdb8.1under中使用ubuntu18.04,但它不起作用:

(ins)(gdb) p strcmp("a", "b")
$20 = (int (*)(const char *, const char *)) 0x7ffff5179d60 <__strcmp_ssse3>

根据this answer , strcmp, 是一种特殊的IFUNC,可以这样设置条件:

condition 1 __strcmp_ssse3(camera->_name.c_str(), "ping")==0

太丑了,不想做第二遍了。

这个答案提供了一个更好的解决方案,它使用std::string::compare

condition 1 camera->_name.compare("ping") == 0
于 2020-01-10T06:00:50.037 回答
1

在VS2015中你可以做

newstring[0]=='x' && newString[1]=='y' && newString[2]=='z'
于 2017-05-05T11:17:17.527 回答
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'
于 2018-07-16T19:23:23.983 回答
1

您可以使用如下方式将其转换为 ac 字符串c_str()

$_streq(myStr.c_str(), "foo")

于 2019-10-04T16:28:49.003 回答
0

要在 std::string 中设置条件断点,您需要在 std::string 的真实内部成员上设置它。您在监视窗口上看到的内容已简化。

您可以使用,!后缀在监视窗口中显示变量的真实结构。在您的示例中:

newString,!

对于 MSVC 2015 – 2019,您可以使用:

对于不超过 15 个字符的字符串:

(newString._Mypair._Myval2._Myres < 16) ?
    strcmp(newString._Mypair._Myval2._Bx._Buf, "short") == 0 : 
    false

对于(甚至历史上)更长的字符串:

(newString._Mypair._Myval2._Myres < 16) ? false : 
     strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_str_value_longer_than_16_chars") == 0

谨防:

  • 变量名在每个条件下都写了两次!
  • 您需要在单行上使用整个表达式。使用下面的复制粘贴版本。

通用条件需要放两次测试值和三次变量名:

(newString._Mypair._Myval2._Myres < 16) ? 
    strcmp(newString._Mypair._Myval2._Bx._Buf, "My_test_string") == 0 : 
    strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_string") == 0

注意:如果您正在wcscmp使用.strcmpstd::wstring

在 C++ 中查找有关小字符串优化的更多信息https://vorbrodt.blog/2019/03/30/sso-of-stdstring/包括用于查找字符串内部缓冲区大小的示例代码。

为方便复制粘贴,所有 std:string 和 std::wstring 单行版本:

(newString._Mypair._Myval2._Myres < 16) ? strcmp(newString._Mypair._Myval2._Bx._Buf, "short") == 0 : false

(newString._Mypair._Myval2._Myres < 16) ? false : strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_str_value_longer_than_16_chars") == 0

(newString._Mypair._Myval2._Myres < 16) ? strcmp(newString._Mypair._Myval2._Bx._Buf, "My_test_string") == 0 : strcmp(newString._Mypair._Myval2._Bx._Ptr, "My_test_string") == 0


(newString._Mypair._Myval2._Myres < 16) ? wcscmp(newString._Mypair._Myval2._Bx._Buf, L"short") == 0 : false

(newString._Mypair._Myval2._Myres < 16) ? false : wcscmp(newString._Mypair._Myval2._Bx._Ptr, L"My_test_str_value_longer_than_16_chars") == 0

(newString._Mypair._Myval2._Myres < 16) ? wcscmp(newString._Mypair._Myval2._Bx._Buf, L"My_test_string") == 0 : wcscmp(newString._Mypair._Myval2._Bx._Ptr, L"My_test_string") == 0

以上所有复制/粘贴示例均在 MSVC 版本 16.9.10 和适用于 Windows 10 的程序上测试。

于 2021-10-01T16:05:47.950 回答