当前位置: 首页 > 面试题库 >

当在管道中放置特定的字符串时,如何监视放入标准输出缓冲区的内容并中断?

端木飞
2023-03-14
问题内容

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

我无权访问特定库的代码,但是我想在该库将特定字符串发送到标准输出后立即中断,以便我可以返回堆栈并研究调用该库的代码部分。当然,我不想等到缓冲区刷新发生。能做到吗?也许是例行公事libstdc++++


问题答案:

这个问题可能是一个很好的起点:如何在gdb中的“将某些内容打印到终端”上设置断点?

因此,无论何时将任何内容写入标准输出,您都至少可以中断。该方法主要涉及write在第一个参数为1(即STDOUT)的条件下在syscall上设置断点。在注释中,还提示您如何检查write调用的字符串参数。

我提出了以下内容,并使用gdb 7.0.1-debian对其进行了测试。看来效果很好。$esp + 8包含指向传递给字符串的内存位置的指针write,因此首先将其转换为整数,然后转换为的指针char$esp + 4包含要写入的文件描述符(对于STDOUT为1)。

$ 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

编辑: 我喜欢这个问题,并找到它的后续答案。我决定写一篇关于它的博客文章。



 类似资料:
  • 问题内容: 我有一个Java程序,它将一些文本输出到控制台。它使用,和其他一些方法来执行此操作。 在程序的最后,我想读取控制台中的所有文本并将其复制到String缓冲区中。我该如何用Java做到这一点?我需要阅读和独立。 问题答案: 好的,这是一个有趣的问题。似乎不是一种同时解决所有方法的优雅方法。(不幸的是没有。) 我确实写了一个丑陋的基于反射的解决方法(我想不要在生产代码中使用它:) …可以像

  • 我正在尝试向arduino的串行监视器发送一些数据,并使led亮起,但我还无法获取它。我的代码中有什么问题请检查这里是arduino代码 下面是java代码

  • 问题内容: 当传递Python程序的输出的管道时,Python解释器对编码感到困惑,并将其设置为None。这意味着这样的程序: 正常运行时可以正常工作,但失败: 编解码器无法在位置编码字符:序数不在范围内(128) 以管道顺序使用时。 使管道工作的最佳方法是什么?我能告诉它使用外壳程序/文件系统/正在使用的任何编码吗? 到目前为止,我所看到的建议是直接修改你的,或使用此hack硬编码: 有更好的方

  • 我在扩展ReplayingDecoder的DecodeEventHandler类中遇到ResourceAkDetector异常。我很难理解何时何地应该释放任何方法的bytbuf。我需要释放传递的字节Buf吗?我尝试释放header、eventBody和attachedData ByteBuf对象,但这在稍后的代码中产生了问题。密码是... 附加信息 当我释放由调用ByteBuf.readBytes

  • 问题内容: 我的测试应用程序是 我想在每个输入字符后看到字符代码。但实际上* s仅在控制台中的’\ n’之后打印。因此,似乎缓冲了stdin(文件的desc 0)。但是读取功能没有缓冲区,不是吗?我哪里错了。 UPD:我使用linux。 所以解决方案是 问题答案: 不幸的是,标准ANSI C无法实现您要查找的行为,并且UNIX终端I / O的默认模式是面向行的,这意味着您将始终需要输入的字符来检索

  • 问题内容: 4年前关闭。 我有个问题。我找到了向下箭头(↓)的HTML代码 凉。现在,我需要像这样在CSS中使用它: 这显然是行不通的,因为它是HTML符号。有关在CSS中使用的这些“转义的unicode”符号的信息似乎较少。我发现了其他类似的符号,但没有箭头。箭头代码是什么? 问题答案: 为什么不只是将CSS文件保存/保存为UTF-8? 如果这还不够好,并且您想保留全部ASCII格式: 一个字符