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

发布于 2024-10-02 07:31:20 字数 95 浏览 5 评论 0原文

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

Can I specify that I want gdb to break at line x when char* x points to a string whose value equals "hello"? If yes, how?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

风筝有风,海豚有海 2024-10-09 07:31:20

您可以使用strcmp

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

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

You can use strcmp:

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

20 is line number, x can be any filename and y can be any variable.

淡忘如思 2024-10-09 07:31:20

使用 中断条件$_streq (以下之一GDB 自己的便利函数):

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。这通常是默认设置,但某些受限环境可能没有它。当然,您可以通过在 GDB 中运行 show configuration 并搜索 --with-python 来检查它。这个 shell oneliner 也能达到这个目的:

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

Use a break condition with $_streq (one of GDB's own convenience functions):

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

or, if your breakpoint already exists, add the condition to it:

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

Since GDB 7.5 (long ago) you can use that and a handful of other native convenience functions for various string matching, including $_regex which supports the Python regex syntax:

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

These are quite less problematic than having to execute the usual strcmp() injected to the process' stack, because that can have undesired side effects.

Alas, using the native functions is not always possible, because they rely on GDB being compiled with Python support. This is usually the default, but some constrained environments might not have it. To be sure, you can check it by running show configuration inside GDB and searching for --with-python. This shell oneliner does the trick, too:

gdb -n -quiet -batch -ex 'show configuration' | grep 'with-python'
煮茶煮酒煮时光 2024-10-09 07:31:20
break x if ((int)strcmp(y, "hello")) == 0

在某些实现上,gdb 可能不知道 strcmp 的返回类型。这意味着您必须进行强制转换,否则它的计算结果将始终为 true!

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

On some implementations gdb might not know the return type of strcmp. That means you would have to cast, otherwise it would always evaluate to true!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文