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

kxxlusnw  于 2023-04-19  发布在  其他
关注(0)|答案(3)|浏览(126)

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

o7jaxewo

o7jaxewo1#

可以使用strcmp

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

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

fykwrbwg

fykwrbwg2#

使用break condition$_streq(GDB自己的convenience functions之一):

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

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

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

Since GDB 7.5 (long ago)你可以使用它和其他一些原生convenience functions来进行各种字符串匹配,包括支持Python正则表达式语法的$_regex

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

与必须执行注入到进程堆栈的通常strcmp()相比,这些问题要少得多,因为这可能会产生不希望的副作用。
遗憾的是,使用本机函数并不总是可行的,因为它们依赖于GDB在Python支持下编译。这通常是默认的,但某些受约束的环境可能没有它。为了确保这一点,您可以通过在GDB中运行show configuration并搜索--with-python来检查它。这个shell oneliner也可以做到这一点:

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

brqmpdu13#

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

在某些实现中,gdb可能不知道strcmp的返回类型。这意味着你必须强制转换,否则它的计算结果总是true!

相关问题