Назад | Перейти на главную страницу

Печать двоичных данных переменного размера из операций чтения и записи с помощью dtrace

Я пытаюсь распечатать двоичные буферы некоторых вызовов read () и write () с помощью dtrace. Проблема с простым использованием printf () и% s заключается в том, что строка заканчивается нулевыми байтами. (\ 000) Существует также tracemem (), но он может распечатывать только буферы фиксированного размера, и мне нравится получать размер буфера из аргумента размера вызовов функций чтения и записи. Более того, вывод 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 байтов. Конечно, это не оптимальное решение.

Любые идеи?

Есть tracemem действие, хотя оно также требует размера, его, безусловно, легче читать: http://docs.oracle.com/cd/E19253-01/819-5488/gcgge/index.html

illumos добавил необязательный третий аргумент, который позволяет вам указать как максимальный размер (второй аргумент), так и размер для фактического отображения (третий), но я не уверен, кто еще поддерживает это.

Основная проблема в том, что архитектура DTrace такова, что она не может читать переменный объем данных, то есть второй аргумент tracemem должно быть постоянный, и поэтому не поможет вам, кроме как сделать ваш код немного аккуратнее. Если вам действительно нужно отображать переменное количество материала, я не думаю, что существует обходной путь, чтобы не иметь 3-аргумента tracemem