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

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

153218 次浏览

你可以使用 strcmp:

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

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

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

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

使用 破坏状态$_streq(广发行自己的 方便功能之一) :

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

或者,如果断点已经存在,则向其添加条件:

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

由于 GDB 7.5(很久以前) ,您可以使用它和其他一些原生 方便功能进行各种字符串匹配,包括支持 Python regex 语法$_regex:

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

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

唉,使用本机函数并不总是可能的,因为它们依赖于使用 Python 支持编译的 GDB。这通常是默认值,但某些受约束的环境可能没有。可以肯定的是,您可以通过在 GDB 中运行 show configuration并搜索 --with-python来检查它。这款外壳线条也有同样的效果:

gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'