gpt4 book ai didi

linux - 间歇性二进制数据的实时监控

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:52:21 26 4
gpt4 key购买 nike

上下文:监控来自程序的低容量、间歇性流

调试某些程序时,有时需要监视某些输出。当输出为 ascii 时,没问题,只需在终端中运行(程序本身,或 nc 如果它使用 TCP 或 UDP 接口(interface),或 cat/dev/somedevice,或socat ...,随便)。

需要:实时监控二进制流...和半解决方案

但有时输出是二进制的。可以将其通过管道传输到 odhd 等各种咒语中,例如od -t d1 用于十进制数,od -t a1 用于增强 ascii 显示(显式不可打印字符使用可打印字符)等。

问题是:那些缓冲输入直到他们有一个完整的行要打印(一行通常适合 16 个输入字符)。所以基本上直到程序发送了16个字符,监控才显示什么。当流是低容量和/或间歇性时,这就违背了实时监控的目的。许多协议(protocol)确实一次只发送少量字节。

最好告诉它“如果你愿意,可以缓冲输入,但在打印它之前不要等待超过延迟 x,即使它不会填满一行”。

man od, man hd 不要提及任何相关选项。

无解

像 wireshark 这样的重型程序并不是一个真正的选择:它们只满足部分需求并且不可组合。我经常这样做:

{ while read a ; do { echo -n -e 'something' ; } | tee >(od -t d1 >&2) ; done ; } | socat unix-connect:/somesocket stdio | od -t d1

这会监视输出,每次我在终端中按回车键时,都会注入(inject)序列“something”。它工作得很好,但终端输出由 16 字节 block 缓冲,因此延迟很多。

总结

如何在没有字节对齐相关延迟的情况下简单地监视程序的二进制输出?

最佳答案

我不知道您使用的是哪个发行版,但请检查您是否拥有或可以安装大多数。从联机帮助页:

OPTIONS
-b Binary mode. Use this switch when you want
to view files containing 8 bit characters.
most will display the file 16 bytes per line
in hexadecimal notation. A typical line
looks like:

01000000 40001575 9C23A020 4000168D ....@..u.#. @...

When used with the -v option, the same line
looks like:

^A^@^@^@ @^@^U u 9C #A0 @^@^V8D ....@..u.#. @...

击键 F(注意大写)不在联机帮助页中,但对您的任务必不可少,它将 most 置于“尾模式”。在此模式下,most 会在出现新输入时更新。

不利的一面是,most 无法被告知以尾模式开始,因此您不能直接通过管道传输到其 stdin(它将尝试读取它一切都在展示任何东西之前)。所以你需要

<your_command>  >/tmp/output

在后台,或者在它自己的终端中,视情况而定。然后

most -b /tmp/output

然后按 F

关于linux - 间歇性二进制数据的实时监控,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30025389/

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