Answers:
您可以使用strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
是行号,x
可以是任何文件名,y
也可以是任何变量。
No symbol "strcmp" in current context.
run
而努力,以便加载动态库。对于来源,请在Google上查找并找到:stackoverflow.com/questions/10000335/…:-)
$_streq
@tlwhitec中的方法更好。
break x if ((int)strcmp(y, "hello")) == 0
在某些实现中,gdb可能不知道strcmp的返回类型。这意味着您必须强制转换,否则它将始终评估为true!
从GDB 7.5开始,您可以使用以下本机便捷功能:
$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)
strcmp()
与每次断点命中时都必须在进程的堆栈上执行“外部”问题相比,问题似乎要少得多。对于调试多线程进程尤其如此。
请注意,您的GDB需要使用Python支持进行编译,而这在当前的Linux发行版中不是问题。可以肯定的是,您可以通过
show configuration
在GDB中运行并搜索进行检查--with-python
。这个小单行代码也可以做到这一点:$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python' --with-python=/usr (relocatable)
对于您的演示案例,用法是
break <where> if $_streq(x, "hello")
或者,如果您的断点已经存在,而您只想向其中添加条件
condition <breakpoint number> $_streq(x, "hello")
$_streq
只匹配整个字符串,因此,如果您想要更狡猾的东西,则应该使用它$_regex
,它支持Python正则表达式语法。
strncmp
和strstr
是其他有用的C查询函数。