2013-09-30 2 views
1

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

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

Я пытался реализовать датчик like this:

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

К сожалению, это не сработает для меня, dtrace сообщает, что он обнаружил недействительный адрес. Кроме того, здесь есть еще одна проблема: строка в libstdC++ использует копию для записи, поэтому недостаточно просто справиться с указателем. Кто-нибудь знает, как это сделать? Я использую dtrace на mac os x.

ответ

0

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