Я хочу написать зонд 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.
Я смог найти рабочее решение самостоятельно. Зонд в моем вопросе имеет глупую ошибку — 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
классы. Это даже работает, если используется ссылка на строку.
Других решений пока нет …