2016-11-22 13 views
0

私は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が正しく表示されます。

スクリプトを修正するにはどうすればよいですか?

答えて

0

あなたの識別子FldOlderはスクリプト変数に過ぎません。この変数は、初期化された値がゼロの整数として解釈されます。 @cast式はポインタ演算を隠して0x00000075アドレスを取得します。これは、& ((CFldOlder*)0)->cust_no->bufを印刷した場合とまったく同じです。

スクリプトを修正するには、@castに有効なポインタを渡します。おそらくコンテキスト変数$FldOlderを意味するでしょう。変数の型がすでにCFldOlder*である場合、@cast(C++ reinterpret_cast<>のように機能します)が必要でない場合もあります。