当char * x指向值等于“ hello”的字符串时,如何在gdb中设置条件断点?


Answers:


198

您可以使用strcmp

break x:20 if strcmp(y, "hello") == 0

20是行号,x可以是任何文件名,y也可以是任何变量。


9
注意:您必须已经在运行程序,这样GDB才能看到stdlib。否则:No symbol "strcmp" in current context.
Ciro Santilli郝海东冠状病六四事件法轮功2015年

1
@CiroSantilli六四事件法轮功包卓轩:如何配置gdb以查看stdlib?
naive231

@ naive231 by“ see”我的意思是看到函数,以便可以破坏它们,而不是破坏源代码:必须为此run而努力,以便加载动态库。对于来源,请在Google上查找并找到:stackoverflow.com/questions/10000335/…:-)
西罗·桑蒂利

1
这种方法可能会有副作用。$_streq@tlwhitec中的方法更好。
rools's


46

从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正则表达式语法

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.