我已经编写了一个systemtap脚本来分析C++程序。在systemtap脚本中,我想提取一个类成员。
下面是c++类的定义:
class CFldOrder
{
public:
ByteArray cust_no;
};
class ByteArray
{
public:
const char* get_value(){return buf;}
private:
char* buf[255];
};以下是系统分流脚本的代码片段:
probe process("/trade/ans_bu").statement("*@entrust.cpp:6614")
{
g_custno = @cast(FldOrder, "CFldOrder")->cust_no->buf
}当脚本运行时,它在这个探测上失败,并显示"user string copy fault addr 0x0000075“。我猜这意味着"@cast(FldOrder,"CFldOrder")->cust_no->buf“不是一个有效的地址。
如果我用gdb调试这个程序,并在"entrust.cpp:6614“位置中断,FldOrder.cust_no.buf可以正确显示。
我如何修复这个脚本?
发布于 2016-11-23 23:18:50
问题可能是您的标识符FldOlder只是一个脚本变量,stap会将其解释为初始化值为零的整数。@cast表达式隐藏了指针算法以获取0x00000075地址-如果输出& ((CFldOlder*)0)->cust_no->buf,您将在C++中获得该地址。
要修复脚本,请向@cast传递一个有效的指针。您可能指的是上下文变量$FldOlder。如果变量的类型已经是CFldOlder*,那么您甚至可能不需要@cast (其工作方式类似于C++ reinterpret_cast<>)。
https://stackoverflow.com/questions/40743898
复制相似问题