2016-11-22 32 views
0

我寫了一個systemtap腳本來剖析C++程序。在systemtap腳本中,我想提取一個類成員。systemtap用戶字符串複製錯誤

下面是一個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 
} 

當腳本運行時,它沒有在這個探頭,並說「用戶字符串複製錯誤在地址0x0000075「。我想這意味着「@cast(FldOrder,」CFldOrder「) - > cust_no-> buf」不是有效的地址。

如果我用gdb調試這個程序並在位置「entrust.cpp:6614」中斷,FldOrder.cust_no.buf顯示正確。

我該如何修復腳本?

回答

0

問題可能是您的標識符FldOlder只是一個腳本變量,該stap將解釋爲初始化值爲零的整數。 @cast表達式隱藏指針算術以獲得0x00000075地址 - 如果您打印的是& ((CFldOlder*)0)->cust_no->buf,則這正是您在C++中獲得的地址。

要修復您的腳本,請通過@cast一個有效的指針。你可能意味着上下文變量$FldOlder。如果變量的類型已經是CFldOlder*,您甚至可能不需要@cast(其工作方式類似於C++ reinterpret_cast<>)。