当 char* x指向值等于 "hello"的字符串时,是否可以指定 gdb 在 x 行中断?如果是,怎么做?
char* x
"hello"
你可以使用 strcmp:
strcmp
break x:20 if strcmp(y, "hello") == 0
20是行号,x可以是任何文件名,y可以是任何变量。
20
x
y
break x if ((int)strcmp(y, "hello")) == 0
在某些实现中,gdb 可能不知道 strcmp 的返回类型。这意味着您必须进行强制转换,否则它将总是被评估为 true!
使用 破坏状态和 $_streq(广发行自己的 方便功能之一) :
$_streq
break [where] if $_streq(x, "hello")
或者,如果断点已经存在,则向其添加条件:
condition <breakpoint number> $_streq(x, "hello")
由于 GDB 7.5(很久以前) ,您可以使用它和其他一些原生 方便功能进行各种字符串匹配,包括支持 Python regex 语法的 $_regex:
$_regex
$_memeq(buf1, buf2, length) $_regex(str, regex) $_streq(str1, str2) $_strlen(str)
与必须执行注入到进程堆栈中的常规 strcmp()相比,这些问题要小得多,因为这可能会产生不希望看到的副作用。
strcmp()
唉,使用本机函数并不总是可能的,因为它们依赖于使用 Python 支持编译的 GDB。这通常是默认值,但某些受约束的环境可能没有。可以肯定的是,您可以通过在 GDB 中运行 show configuration并搜索 --with-python来检查它。这款外壳线条也有同样的效果:
show configuration
--with-python
gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'