我试图用dtrace打印一些read()和write()调用的二进制缓冲区。 使用printf()和%s的问题是string以空字节结尾。 (\ 000)还有tracemem(),但它只能打印出固定大小的缓冲区,我喜欢从读取和写入函数调用的size参数中获取缓冲区的大小。 而且,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字节的这种工作。 当然,这不是最佳解决scheme。
有任何想法吗?
有tracemem行动,虽然这也需要一个大小,这当然更容易阅读: http : //docs.oracle.com/cd/E19253-01/819-5488/gcgge/index.html
Illumos增加了一个可选的第三个参数,可以让你指定最大尺寸(第二个参数)和实际显示的尺寸(第三个),但我不确定还有谁支持。
基本的问题是,DTrace的架构是这样的,它不能读取可变数量的数据,也就是说, tracemem的第二个参数必须是常量 ,所以除了让你的代码有点整齐。 如果你需要实际显示可变数量的东西,我不认为有一个解决方法不具有三参数tracemem