Есть ли хороший способ получить доступ к структуре в пользовательской области?

Я хочу использовать Dtrace для получения значения члена структуры в пользовательской области, а не в ядре.

Код C выглядит следующим образом:

typedef struct
{
     int a;
}st_A;

void fun1(st_A *p)
{
    ......
}

Сценарий Dtrace выглядит следующим образом:

#!/usr/sbin/dtrace -qs

pid$1::fun1:entry
{
    printf("%d\n", *(int*)copyin(arg0, 4));
}

Лично я считаю этот скрипт Dtrace очень корявым. Если структура содержит много элементов, мне нужно вычислить смещение каждого члена. Если в структуре есть массив указателей, то ситуация ужасна!

Итак, есть ли простой и изящный способ получить доступ к membesr в структуре в пользовательском процессе? Спасибо большое!


person Nan Xiao    schedule 10.01.2014    source источник


Ответы (1)


Более обычный способ сделать это в Solaris:

typedef struct {
    int a;
} st_A;

pid$1::fun:entry
{
    self->kp = (st_A *)copyin(arg0, sizeof (st_A));
    printf("a = %d\n", self->kp->a);
}

но вы правы: если вы хотите следовать указателям внутри своей структуры, вам придется повторять copyin() для каждого разыменования.

Помните, что вы можете #include заголовочный файл, если вы вызываете dtrace(1) с опцией -C. В любом случае используйте -32 или -64 для указания модели данных вашего процесса-жертвы: по умолчанию dtrace(1) будет интерпретировать любые указанные вами типы, используя модель данных работающего ядра.

Я думаю, что DTrace от illumos выполняет автоматическое копирование, но я не смотрел на это. Я не знаю о других реализациях.

person Robert Harris    schedule 10.01.2014