DTrace - Как правильно получить начальные параметры в возвратном зонде

Я пытаюсь прочитать начальные аргументы, которые были переданы в функцию в моем возвращаемом зонде. В отличие от входного зонда переменные-аргументы (arg0,arg1,...) в возвратном зонде не содержат начальных параметров, и я не уверен, как мне получить эти значения.

Кроме того, я хотел бы избежать сохранения значений в глобальных переменных из-за проблем с параллелизмом.


person JosephH    schedule 20.07.2012    source источник


Ответы (2)


Вы можете сохранить параметры в локальном хранилище потока, например.

pid$target:foo:bar:entry
{
    self->arg0 = arg0;
    self->arg1 = arg1;
    /*
     * Avoid the race in which dtrace(1) attaches to the victim during
     * the window between the two probes.
     */
    self->trace = 1;
}

pid$target:foo:bar:return
/self->trace/
{
    printf("arg0 = 0x%x, arg1 = 0x%x\n", self->arg0, self->arg1);
    /* Deallocate the thread-local storage. */
    self->arg0 = 0;
    self->arg1 = 0;
}
person Robert Harris    schedule 06.08.2012

Как ответил rmh - использование локальных переменных - это способ сделать это. В противном случае dtrace пришлось бы сохранять для вас значения при входе — и он ничего не знает о входящих аргументах или ваших ожиданиях, и ему пришлось бы выполнять сборку мусора. (Технически он знает, что произойдет - в конечном итоге - но это добавило бы сложных накладных расходов по сравнению с подходом с локальными переменными, который отображается на простой набор виртуальных D-инструкций).

person Paul Fox    schedule 27.06.2013