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


81

假设我有这个功能:

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

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

设定条件 newString == "my value"

无效,断点被禁用,并显示错误“找不到重载的运算符”


1
我不知道这是否是意图,但是您的代码已损坏。Func1返回void,但是您返回std :: string。Func2未显示,但它可能不会返回std :: string,此外,您使用的是==(等于)运算符,而不是=(赋值)。
falstro

我这边的错误示例已修复,但要点是要说明使用std :: string获得条件断点的问题
Eli 2009年

Answers:


49

某些搜索未能找到执行此操作的任何方法。建议的替代方法是将测试放入代码中并添加标准断点:

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

或通过单个字符比较来构建测试。即使查看字符串中的各个字符也有点麻烦。在Visual Studio 2005中,我不得不深入挖掘成员变量,例如

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

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


+1。我只是在写一个类似的答案。我知道做到这一点的唯一方法是窥探实现。请注意,对于std :: string,由于短字符串优化,这可能会变得非常复杂。
阿德里安·麦卡锡

这具有myStr._Bx._Buf仅在时有效的问题myStr._Mysize < _BUF_SIZE。否则,您需要使用myStr._Bx._Ptr
RunHolt

3
此答案与较新的Visual Studio不再相关。strcmp(myStr._Mypair._Myval2._Bx._Ptr, "xyz") == 0才有效
Michael Veksler '18年

85

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- breakpoints.aspx


我喜欢这个答案,它对我有用(除了一些不可访问的内存例外)。
摘自

23
正如其他注释所建议的那样,访问newString._Bx._Ptr可能不适用于短字符串。在我的情况下,我得到“尝试读取或写入受保护的内存”。对于短字符串(不newString._Bx._Buf超过16个字符?),似乎可以容纳这些字符。
vvnurmi

1
这也应该在VS2015中起作用吗?因为它似乎对我没有用...
BmyGuest

1
我不了解VS,但是对于gdb,您可以编写strcmp(newString.c_str(), "my_value") == 0。可能需要更多的内部计算,但是恕我直言,更容易记住。
Jounathaen

1
@Jounathaen不幸的是,在VS中不起作用:“此表达式具有副作用,将不被评估。”
letmaik


13

在VS2017中,我可以将条件设​​置为:

strcmp(&newString[0], "my value") == 0

VS2019也可以使用,并且比所有其他答案更明显,更易读且更容易记住。
Scott Hutchinson

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”,则中断。当然,您可以继续使用其他字符。丑陋的..但是它为我节省了一些时间。



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

这是小缓冲区优化的结果。此处是高级概述blogs.msmvps.com/gdicanio/2016/11/17/…。在深入这里更多akrzemi1.wordpress.com/2014/04/14/common-optimizations
Aerom Xundes

2

尝试strcmpgdb8.1under中使用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


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'

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.