当char * x指向一个值为“hello”的string时,如何在gdb中设置条件断点?
我可以指定,当char* x
指向值为"hello"
的string时,我希望gdb在第x行中断? 如果是的话,怎么样?
你可以使用strcmp
:
break x:20 if strcmp(y, "hello") == 0
20
是行号, x
可以是任何文件名, y
可以是任何variables。
break x if ((int)strcmp(y, "hello")) == 0
在一些实现上,gdb可能不知道strcmp的返回types。 这意味着你将不得不施放,否则将永远评估为真!
由于GDB 7.5,你可以使用这些方便的便利function :
$_memeq(buf1, buf2, length)` $_streq(str1, str2) $_strlen(str) $_regex(str, regex)
似乎没有什么问题比在每次命中断点时在进程堆栈上执行一个“外部” strcmp()
。
注意你的GDB需要用Python支持进行编译,这对当前的Linux发行版来说不是问题。 可以肯定的是,你可以通过在GDB里运行
show configuration
并search--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
只匹配整个string,所以如果你想要更狡猾的东西,你应该使用$_regex
,它支持Python的正则expression式语法 。