私はC++プログラムをプロファイルするためのsystemtapスクリプトを書いています。 systemtapスクリプトでは、クラスメンバーを抽出します。ここでsystemtap user stringコピーフォールト
は、C++クラスの定義です:
ここ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が正しく表示されます。
スクリプトを修正するにはどうすればよいですか?