DTrace: как распечатать буферы памяти - PullRequest
2 голосов
/ 09 августа 2010

Мне нужно отследить все вызовы pwrite (2), сделанные для определенного файла, и распечатать все буферы, которые должны записываться побайтово.Ожидаемые данные не в формате строки ASCII, поэтому я не могу использовать:

printf("%s\n", copyinstr(arg1))

Я узнал о copyin (arg1, arg2), но это дает мне пустоту * и все примеры, которые я нашел скрытымиснова в строку, вызвав stringof, например:

printf("%s\n", stringof(copyin(arg1, arg2)))

Мне нужно как-то отобразить все байты в скопированном буфере.Есть предложения?

Спасибо, Inso.

Ответы [ 2 ]

1 голос
/ 08 февраля 2019

tracemem(address, size_t nbytes, size_t dbytes), где nbytes является константой, а dbytes может быть динамическим и меньше nbytes.

tracemem

void tracemem(address, size_t nbytes)
void tracemem(address, size_t nbytes, size_t dbytes)

Действие tracemem принимает выражение D в качестве первого аргумента, адрес и константа в качестве второго аргумента, nbytes. tracemem копирует память с адреса, указанного адресатом, в адресную буфер на длину, указанную в nbytes.

Если указан третий аргумент, дбайт, будет только до дбайт скопировано. дБ может быть переменной величиной, но она должна быть меньше чем или равно nbytes. Это полезно, когда вы смотрите на то, что имеет известную верхнюю границу, но фактическое количество байтов может различаться. Например, рассмотрим случай, когда вы сбрасываете Пакет Ethernet. Максимальный размер основан на MTU, но количество данных в данном пакете является переменным.

1 голос
/ 10 августа 2010

Хорошо, это сделано с tracemem(buffer, size) вызовом.

...