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

341*_*008 159 c debugging gdb conditional-breakpoint

char* x指向值等于的字符串时,是否可以指定我希望gdb在第x行中断"hello"?如果有,怎么样?

Nat*_*man 196

你可以使用strcmp:

break x:20 if strcmp(y, "hello") == 0
Run Code Online (Sandbox Code Playgroud)

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

  • 注意:您必须已经运行该程序,以便GDB将看到stdlib.否则:在当前上下文中没有符号"strcmp" (9认同)
  • 这种方法可能有副作用。来自@tlwhitec 的`$_streq` 方法更好。 (3认同)

Tob*_*han 53

break x if ((int)strcmp(y, "hello")) == 0
Run Code Online (Sandbox Code Playgroud)

在某些实现中,gdb可能不知道strcmp的返回类型.这意味着您必须进行投射,否则它将始终评估为真!


tlw*_*tec 36

从GDB 7.5开始,您可以使用这些便捷的便捷功能:

$_memeq(buf1, buf2, length)`
$_streq(str1, str2)
$_strlen(str)
$_regex(str, regex)
Run Code Online (Sandbox Code Playgroud)

看起来比strcmp()每次遇到断点时在进程'堆栈上执行"外部"都要少得多.

请注意,您的GDB需要使用Python支持进行编译,这不是当前Linux发行版的问题.可以肯定的是,您可以通过show configuration在GDB中运行并搜索来检查它--with-python.这个小小的oneliner也可以做到这一点:

$ gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
             --with-python=/usr (relocatable)
Run Code Online (Sandbox Code Playgroud)

对于您的演示案例,用法将是

break <where> if $_streq(x, "hello")
Run Code Online (Sandbox Code Playgroud)

或者,如果您的断点已经存在,并且您只想添加条件

condition <breakpoint number> $_streq(x, "hello")
Run Code Online (Sandbox Code Playgroud)

$_streq只匹配整个字符串,所以如果你想要更狡猾的东西你应该使用$_regex,它支持Python正则表达式语法.