2016-11-22 5 views
0

Я написал сценарий systemtap для профилирования программы на C++. В сценарии systemtap я хочу извлечь член класса.systemtap user string copy fault

Вот с ++ определение класса:

class CFldOrder 
{ 
public: 
    ByteArray cust_no; 
}; 

class ByteArray 
{ 
public: 
    const char* get_value(){return buf;} 
private: 
    char* buf[255]; 
}; 

Вот фрагмент кода сценария Systemtap:

probe process("/trade/ans_bu").statement("*@entrust.cpp:6614") 
{ 
    g_custno = @cast(FldOrder, "CFldOrder")->cust_no->buf 
} 

Когда сценарий запущен, он потерпел неудачу в этом зонде и сказал: «пользователь ошибка копирования строки в addr 0x0000075 ". Я предполагаю, что это означает, что «@cast (FldOrder,« CFldOrder ») -> cust_no-> buf" не является допустимым адресом.

Если я отлаживаю эту программу с помощью gdb и ломаю в позиции «entrust.cpp: 6614», FldOrder.cust_no.buf отображается правильно.

Как исправить скрипт?

ответ

0

Проблема, вероятно, заключается в том, что ваш идентификатор FldOlder является просто переменной скрипта, который stap будет интерпретировать как целое число с инициализированным значением нуля. Выражение @cast скрывает арифметику указателя, чтобы получить этот адрес 0x00000075 - это именно то, что вы получили бы на C++, если бы вы напечатали & ((CFldOlder*)0)->cust_no->buf.

Чтобы исправить ваш скрипт, перейдите @cast действительный указатель. Вероятно, вы имели в виду переменную контекста $FldOlder. Вам может даже не понадобиться @cast (который работает как C++ reinterpret_cast<>), если тип переменной уже CFldOlder*.