181

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

4

3 回答 3

217

您可以使用strcmp

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

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

于 2010-11-15T11:27:15.077 回答
68

使用 带有(GDB 自己的便利功能之一)的中断条件$_streq

break [where] if $_streq(x, "hello")

或者,如果您的断点已经存在,请向其中添加条件:

condition <breakpoint number> $_streq(x, "hello")

自 GDB 7.5(很久以前)以来,您可以使用它和一些其他本机便利函数来进行各种字符串匹配,包括$_regex支持Python 正则表达式语法

$_memeq(buf1, buf2, length)
$_regex(str, regex)
$_streq(str1, str2)
$_strlen(str)

这些问题比必须执行通常strcmp()注入进程堆栈的问题要小得多,因为这可能会产生不希望的副作用。

唉,使用本机函数并不总是可行的,因为它们依赖于使用 Python 支持编译的 GDB。这通常是默认设置,但某些受限环境可能没有它。可以肯定的是,您可以通过show configuration在 GDB 中运行并搜索--with-python. 这个 shell oneliner 也可以解决问题:

gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
于 2017-05-10T12:46:33.040 回答
58
break x if ((int)strcmp(y, "hello")) == 0

在某些实现中,gdb 可能不知道 strcmp 的返回类型。这意味着你必须强制转换,否则它总是会评估为真!

于 2012-03-22T09:16:46.537 回答