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

如何从strace输出解码此信息

胡承悦
2023-03-14
问题内容

我写了一个小小的go脚本,并使用strace跟踪了该脚本,我试图使用netlink协议从内核中获取审核消息,就像auditd一样。

以下是我的旅途中strace的输出脚本-
http://paste.ubuntu.com/8272760/

我试图找到auditd提供给sendto函数的参数。当我在auditd上运行strace时,我得到以下输出

sendto(3, "\20\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0", 16, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 16

当我追踪我的go文件时,我得到以下输出。我想解码此语句的第二个参数

sendto(3, "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t", 17, 0, {sa_family=AF_NETLINK, pid=0, groups=00000000}, 12) = 17

再具体一点

"\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"

现在我想将其转换为字符串或字节数组,有什么办法可以将其转换为字符串或字节数组?

在我实际的go代码中,此参数是一个字节数组。

https://github.com/mozilla/Audit-
Go/blob/testing/netlink_old.go#L58


问题答案:

我对您的问题的理解是,您通过比较strace的输出尝试将auditd发送的内容与程序发送的内容进行比较,并且遇到将strace提供的字符串转换为Go []
byte数据类型的问题。

strace输出遵循字符串文字的GNU C表示形式,其字符可以按以下方式转义:

\\ Backslash character. 
\? Question mark character.
\' Single quotation mark. 
\" Double quotation mark. 
\a Audible alert. 
\b Backspace character. 
\e <ESC> character. (This is a GNU extension.) 
\f Form feed. 
\n Newline character. 
\r Carriage return. 
\t Horizontal tab. 
\v Vertical tab.
\o, \oo, \ooo Octal number.
\xh, \xhh, \xhhh, ... Hexadecimal number.

请注意,八进制或十六进制数字的数量可以变化。在Go中,字符也可以转义,但是规则不同-
请参见http://golang.org/ref/spec#Rune_literals

特别是,八进制值系统地用3位数字表示,以避免任何歧义。要声明具有此类字符序列的[] byte,您将必须编写如下内容:

// In strace, it was "\21\0\0\0\350\3\5\0\1\0\0\0\0\0\0\0\t"
wb := []byte("\021\000\000\000\350\003\005\000\001\000\000\000\000\000\000\000\t")

请注意,strace中的-
x选项将对不可打印的字符使用固定长度的十六进制编码,这使得在Go程序中直接使用这些字符串变得更加容易。-xx选项即使对于可打印字符也将输出十六进制编码的字节,这使IMO更加容易。

无论如何,使用文字字符串初始化[] byte不一定是一种好的样式(甚至不是一个好主意)。字符串适用于UTF-8字符,不适用于二进制数据。



 类似资料:
  • 这是代码。 输出是''

  • 数据:“{\”数据\“:[\”124“,\”611“]}”,Lasteventid:“”} 是否可以只抓取,因为否则客户端在反序列化方面会出现问题。

  • 我正在尝试从解码的mp4缓冲区中获取PCM样本以进行进一步处理。我首先从使用手机的相机应用程序录制的视频文件中提取音轨,并且我已经确保在获得“音频/mp4”mime键时选择了音轨: 之后,我遍历轨道,向编解码器提供编码访问单元流,并将解码的访问单元拉入ByteBuffer(这是我从此处发布的视频渲染示例中回收的代码https://github.com/vecio/MediaCodecDemo):

  • strace 是 Linux 环境下的一款程序调试工具,用来监察一个应用程序所使用的系统呼叫及它所接收的系统信息。 strace 是一个有用的小工具,它可以通过跟踪系统调用来让你知道一个程序在后台所做的事情。Strace 是一个基础的调试工具,在大多数 Linux 系统上默认已经安装;但是即便你不是在跟踪一个问题的时候它也是一个极好的软件。它能告诉你很多关于一个 Linux 程序怎样工作的信息。

  • 问题内容: 一位同事曾经告诉我,在Linux上一切调试失败时,最后的选择是使用strace。 我试图学习这种奇怪工具背后的科学知识,但是我不是系统管理员,我并没有真正获得结果。 所以, 到底是什么,它做什么? 应该如何使用?在哪种情况下应使用? 应该如何理解和处理输出? 总之, 在简单的话 ,怎么做这个东西的工作? 问题答案: Strace概述 strace可以看作是轻量级的调试器。它允许程序员/