Imprimindo dados binários de tamanho variável a partir de leituras e gravações com dtrace

2

Estou tentando imprimir os buffers binários de algumas chamadas read () e write () com o dtrace. O problema de apenas usar printf () e% s é que a string é terminada em bytes nulos. (\ 000) Há também tracemem (), mas ele só pode imprimir buffers de tamanho fixo e eu gostaria de obter o tamanho do buffer fora do argumento de tamanho das chamadas de função de leitura e gravação. Além disso, a saída do dtrace deve ser legível por máquina e tracemem () não é. Minha abordagem atual é assim:

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]);
}

Esse tipo de trabalho funciona se o comando read () ou write () nunca usar mais de 64 bytes. Claro, isso não é uma solução ideal.

Alguma idéia?

    
por dax 10.03.2013 / 14:31

1 resposta

1

Existe a ação tracemem , embora também tenha um tamanho, é certamente mais fácil de ler: link

illumos adicionou um terceiro argumento opcional que permite especificar tanto um tamanho máximo (o segundo argumento) quanto o tamanho para exibir (o terceiro), mas não tenho certeza de quem mais suporta isso.

O problema básico é que a arquitetura do DTrace é tal que não pode ler uma quantidade variável de dados, ou seja, o segundo argumento para tracemem deve ser constante , e assim não o ajudará além de tornar seu código um pouco mais organizado. Se você precisa realmente exibir quantidades variáveis de coisas, eu não acho que existe uma solução alternativa para não ter o argumento de 3 tracemem

    
por 10.05.2013 / 22:18

Tags