Как напечатать содержимое строки libstdc ++ с помощью dtrace

Я хочу написать зонд dtrace, который будет соответствовать функции с std::string аргумент и распечатать содержимое строки:

void func(std::string some) {
/* some code here */
}

Я пытался реализовать зонд как это:

pid$target::func(std??string):entry
{
this->str = *(uintptr_t*)copyin(arg1, sizeof(char*));
printf("arg1 %s", copyinstr(this->str));
}

К сожалению, это не работает для меня, dtrace сообщает, что обнаружил неверный адрес. Также здесь есть другая проблема — строка в libstdc ++ использует copy при записи, поэтому простого копирования указателя здесь недостаточно. Кто-нибудь знает, как это сделать? Я использую Dtrace на Mac OS X.

1

Решение

Я смог найти рабочее решение самостоятельно. Зонд в моем вопросе имеет глупую ошибку — arg0 должен быть скопирован вместо arg1. Итак, рабочий зонд это:

pid$target::func(*):entry
{
this->str = *((uintptr_t*)copyin(arg0, sizeof(void*)));
printf("darg %s", copyinstr(this->str));
}

С другой стороны, для функции-члена arg1 следует использовать:

class some {
public:
void func(const std::string arg) {
std::cout << "arg " << arg << std::endl;
}
};

Зонд для функции some::func должен выглядеть так:

pid$target::some??func(*):entry
{
this->str = *((uintptr_t*)copyin(arg1, sizeof(void*)));
printf("darg %s", copyinstr(this->str));
}

Это работает как для libc ++, так и для libstdc ++ std::string классы. Это даже работает, если используется ссылка на строку.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector