0

我编写了一个 systemtap 脚本来分析 C++ 程序。在 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 会正确显示。

如何修复脚本?

4

1 回答 1

0

问题可能是您的标识符FldOlder只是一个脚本变量,该 stap 将解释为初始化值为 0 的整数。该@cast表达式隐藏了指针运算以获取该0x00000075地址——这正是您在 C++ 中打印& ((CFldOlder*)0)->cust_no->buf.

要修复您的脚本,请传递@cast一个有效的指针。您可能是指上下文变量$FldOlder。如果@cast变量reinterpret_cast<>的类型已经是CFldOlder*.

于 2016-11-23T15:18:49.797 回答