2016-11-22 19 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<>)。