Я пытаюсь распечатать двоичные буферы некоторых вызовов 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