gpt4 book ai didi

c++ - 如何监控放入标准输出缓冲区的内容并在特定字符串存放在管道中时中断?

转载 作者:IT老高 更新时间:2023-10-28 22:17:56 28 4
gpt4 key购买 nike

在 Linux 中,使用 C/C++ 代码,使用 gdb,如何添加 gdb 断点来扫描传入的字符串以便在特定字符串上中断?

我无权访问特定库的代码,但我想在该库将特定字符串发送到标准输出时立即中断,以便我可以返回堆栈并调查正在调用的代码部分图书馆。当然,我不想等到缓冲区刷新发生。这可以做到吗?可能是 libstdc++ 中的例程?

最佳答案

这个问题可能是一个很好的起点:how can I put a breakpoint on "something is printed to the terminal" in gdb?

因此,您至少可以在将某些内容写入标准输出时中断。该方法主要涉及在 write 系统调用上设置断点,条件是第一个参数是 1(即 STDOUT)。在评论中,还有一个关于如何检查 write 调用的字符串参数的提示。

x86 32 位模式

我想出了以下内容并使用 gdb 7.0.1-debian 对其进行了测试。它似乎工作得很好。 $esp + 8 包含一个指向传递给 write 的字符串的内存位置的指针,因此首先将其转换为整数,然后再转换为指向 char 的指针$esp + 4 包含要写入的文件描述符(1 表示 STDOUT)。

$ gdb break write if 1 == *(int*)($esp + 4) && strcmp((char*)*(int*)($esp + 8), "your string") == 0

x86 64 位模式

如果您的进程运行在 x86-64 模式下,则参数通过暂存器 %rdi%rsi

$ gdb break write if 1 == $rdi && strcmp((char*)($rsi), "your string") == 0

请注意,由于我们使用的是暂存寄存器而不是堆栈上的变量,因此删除了一级间接。

变体

strcmp 以外的函数可以用在上面的代码片段中:

  • strncmp如果您想匹配正在写入的字符串的第一个 n 个字符,这很有用
  • strstr可用于在字符串中查找匹配项,因为您不能始终确定您要查找的字符串位于通过 write 写入的字符串的 beginning> 功能。

编辑:我很喜欢这个问题并找到了后续答案。我决定做一个blog post关于它。

关于c++ - 如何监控放入标准输出缓冲区的内容并在特定字符串存放在管道中时中断?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8235436/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com