web-dev-qa-db-ja.com

dtraceを使用した読み取りおよび書き込みからの可変サイズのバイナリデータの印刷

Dtraceを使用していくつかのread()およびwrite()呼び出しのバイナリバッファーを出力しようとしています。 printf()と%sを使用する場合の問題は、文字列がnullバイトで終了することです。 (\ 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バイトを超えて使用しない場合に機能します。もちろん、これは最適なソリューションではありません。

何か案は?

2
dax

tracememアクションがありますが、これもサイズが必要ですが、確かに読みやすくなっています。 http://docs.Oracle.com/cd/E19253-01/819-5488/gcgge/index.html

illumosは、最大サイズ(2番目の引数)と実際に表示するサイズ(3番目)の両方を指定できるオプションの3番目の引数を追加しましたが、他に誰がそれをサポートしているかはわかりません。

基本的な問題は、DTraceのアーキテクチャが、可変量のデータを読み取れない、つまり、tracememの2番目の引数がconstantなので、コードを少し整理する以外に役立ちません。実際に可変量のものを表示する必要がある場合、3つの引数tracememを持たないことに対する回避策は存在しないと思います。

1
richlowe