假设我有这个功能:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
newString
有特定值时如何设置条件中断?(不更改来源)
设定条件 newString == "my value"
无效,断点被禁用,并显示错误“找不到重载的运算符”
假设我有这个功能:
std::string Func1(std::string myString)
{
//do some string processing
std::string newString = Func2(myString)
return newString;
}
newString
有特定值时如何设置条件中断?(不更改来源)
设定条件 newString == "my value"
无效,断点被禁用,并显示错误“找不到重载的运算符”
Answers:
某些搜索未能找到执行此操作的任何方法。建议的替代方法是将测试放入代码中并添加标准断点:
if (myStr == "xyz")
{
// Set breakpoint here
}
或通过单个字符比较来构建测试。即使查看字符串中的各个字符也有点麻烦。在Visual Studio 2005中,我不得不深入挖掘成员变量,例如
myStr._Bx._Buf[0] == 'x' && myStr._Bx._Buf[1] == 'y' && myStr._Bx._Buf[2] == 'z'
这些方法都不能令人满意。我们应该更好地访问标准库的无处不在的功能。
myStr._Bx._Buf
仅在时有效的问题myStr._Mysize < _BUF_SIZE
。否则,您需要使用myStr._Bx._Ptr
strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0
才有效
Visual Studio 2010/2012中有一种更简单的方法。
要完成您在ANSI中寻找的内容,请使用以下命令:
strcmp(newString._Bx._Ptr,"my value")==0
在unicode中(如果newString是unicode)使用以下代码:
wcscmp(newString._Bx._Ptr, L"my value")==0
您不仅可以进行比较,还可以做更多的事情,您可以在此处了解更多信息:
newString._Bx._Ptr
可能不适用于短字符串。在我的情况下,我得到“尝试读取或写入受保护的内存”。对于短字符串(不newString._Bx._Buf
超过16个字符?),似乎可以容纳这些字符。
strcmp(newString.c_str(), "my_value") == 0
。可能需要更多的内部计算,但是恕我直言,更容易记住。
在VS2017中你可以做
strcmp(newString._Mypair._Myval2._Bx._Buf,"myvalue")==0
在VS2017中,我可以将条件设置为:
strcmp(&newString[0], "my value") == 0
尽管我不得不使用类似于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”,则中断。当然,您可以继续使用其他字符。丑陋的..但是它为我节省了一些时间。
VS2012:
我只使用了以下条件,因为newString._Bx._Ptr
(如OBWANDO的回答一样)引用了非法内存
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
在gdb8.1
under中使用ubuntu18.04
,但不起作用:
(ins)(gdb) p strcmp("a", "b")
$20 = (int (*)(const char *, const char *)) 0x7ffff5179d60 <__strcmp_ssse3>
根据此答案,strcmp
是一种特殊的IFUNC,可以这样设置条件:
condition 1 __strcmp_ssse3(camera->_name.c_str(), "ping")==0
这很丑陋,不想第二次这样做。
这个答案提供了一个更好的解决方案,它使用std :: string :: compare:
condition 1 camera->_name.compare("ping") == 0
您可以c_str()
像这样将其转换为ac字符串:
$_streq(myStr.c_str(), "foo")