使用 dtrace 打印读取和写入的可变大小二进制数据

使用 dtrace 打印读取和写入的可变大小二进制数据

我正在尝试使用 dtrace 打印出一些 read() 和 write() 调用的二进制缓冲区。仅使用 printf() 和 %s 的问题在于字符串以空字节结尾。(\000) 还有 tracemem(),但它只能打印出固定大小的缓冲区,我喜欢从 read 和 write 函数调用的大小参数中获取缓冲区的大小。此外,dtrace 的输出应该是机器可读的,而 tracemem() 则不是。我目前的方法如下:

syscall::write:return,
syscall::write_nocancel:return,
syscall::read:return,
syscall::read_nocancel:return
/self->start != 0 && arg0 != -1/
{
    this->content = (char*) copyin(self->arg1,arg0);
    printf("%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c", this->    content[0],this->content[1],this->content[2],this->content[3],this->content[4],this->content[5],this->content[6],this->content[7],this->content[8]    ,this->content[9],this->content[10],this->content[11],this->content[12],this->content[13],this->content[14],this->content[15],this->content[16],this-    >content[17],this->content[18],this->content[19],this->content[20],this->content[21],this->content[22],this->content[23],this->content[24],this->    content[25],this->content[26],this->content[27],this->content[28],this->content[29],this->content[30],this->content[31],this->content[32],this->    content[33],this->content[34],this->content[35],this->content[36],this->content[37],this->content[38],this->content[39],this->content[40],this->    content[41],this->content[42],this->content[43],this->content[44],this->content[45],this->content[46],this->content[47],this->content[48],this->    content[49],this->content[50],this->content[51],this->content[52],this->content[53],this->content[54],this->content[55],this->content[56],this->    content[57],this->content[58],this->content[59],this->content[60],this->content[61],this->content[62],this->content[63]);
}

如果 read() 或 write() 命令使用的数据不超过 64 个字节,这种方法是可行的。当然,这不是最佳解决方案。

有任何想法吗?

答案1

这是tracemem动作,尽管也需要大小,但肯定更容易阅读:http://docs.oracle.com/cd/E19253-01/819-5488/gcgge/index.html

illumos 添加了一个可选的第 3 个参数,让您指定最大尺寸(第 2 个参数)和实际显示的尺寸(第 3 个参数),但我不确定还有谁支持这一点。

基本问题是 DTrace 的架构使得它无法可变的数据量,也就是说,第二个参数tracemem必须是持续的,因此除了让你的代码更整洁之外,不会对你有任何帮助。如果你需要实际显示可变数量的东西,我认为没有不使用 3 参数的解决方法tracemem

相关内容