【问题标题】:systemtap user string copy faultsystemtap 用户字符串复制错误
【发布时间】:2016-11-23 23:18:49
【问题描述】:

我编写了一个 systemtap 脚本来分析 C++ 程序。在 systemtap 脚本中,我想提取一个类成员。

这里是c++类的定义:

class CFldOrder
{
public:
    ByteArray cust_no;
};

class ByteArray
{
public:
    const char* get_value(){return buf;}
private:
    char* buf[255];
};

这里是systemtap脚本的代码sn-p:

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 会正确显示。

如何修复脚本?

【问题讨论】:

    标签: systemtap


    【解决方案1】:

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

    要修复您的脚本,请传递@cast 一个有效指针。您可能指的是上下文变量$FldOlder。如果变量的类型已经是 CFldOlder*,您甚至可能不需要 @cast(其工作方式类似于 C++ reinterpret_cast<>)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-25
      • 1970-01-01
      • 2012-10-25
      • 2017-06-15
      • 2012-06-17
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      相关资源
      最近更新 更多