我可以指定当char* x指向一个值等于"hello"的字符串时,我希望gdb在第x行中断吗?如果可以,如何?
char* x
"hello"
o7jaxewo1#
可以使用strcmp:
strcmp
break x:20 if strcmp(y, "hello") == 0
20是行号,x可以是任何文件名,y可以是任何变量。
20
x
y
fykwrbwg2#
使用break condition和$_streq(GDB自己的convenience functions之一):
$_streq
break [where] if $_streq(x, "hello")
或者,如果断点已经存在,请向其添加条件:
condition <breakpoint number> $_streq(x, "hello")
Since GDB 7.5 (long ago)你可以使用它和其他一些原生convenience functions来进行各种字符串匹配,包括支持Python正则表达式语法的$_regex:
$_regex
$_memeq(buf1, buf2, length) $_regex(str, regex) $_streq(str1, str2) $_strlen(str)
与必须执行注入到进程堆栈的通常strcmp()相比,这些问题要少得多,因为这可能会产生不希望的副作用。遗憾的是,使用本机函数并不总是可行的,因为它们依赖于GDB在Python支持下编译。这通常是默认的,但某些受约束的环境可能没有它。为了确保这一点,您可以通过在GDB中运行show configuration并搜索--with-python来检查它。这个shell oneliner也可以做到这一点:
strcmp()
show configuration
--with-python
gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
brqmpdu13#
break x if ((int)strcmp(y, "hello")) == 0
在某些实现中,gdb可能不知道strcmp的返回类型。这意味着你必须强制转换,否则它的计算结果总是true!
3条答案
按热度按时间o7jaxewo1#
可以使用
strcmp
:20
是行号,x
可以是任何文件名,y
可以是任何变量。fykwrbwg2#
使用break condition和
$_streq
(GDB自己的convenience functions之一):或者,如果断点已经存在,请向其添加条件:
Since GDB 7.5 (long ago)你可以使用它和其他一些原生convenience functions来进行各种字符串匹配,包括支持Python正则表达式语法的
$_regex
:与必须执行注入到进程堆栈的通常
strcmp()
相比,这些问题要少得多,因为这可能会产生不希望的副作用。遗憾的是,使用本机函数并不总是可行的,因为它们依赖于GDB在Python支持下编译。这通常是默认的,但某些受约束的环境可能没有它。为了确保这一点,您可以通过在GDB中运行
show configuration
并搜索--with-python
来检查它。这个shell oneliner也可以做到这一点:brqmpdu13#
在某些实现中,gdb可能不知道strcmp的返回类型。这意味着你必须强制转换,否则它的计算结果总是true!