systemtap用户字符串复制错误

时间:2016-11-22 14:02:28

标签: systemtap

我编写了一个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
}

当脚本运行时,它在此探测失败并说“addr 0x0000075处的用户字符串复制错误”。我想这意味着“@cast(FldOrder,”CFldOrder“) - > cust_no-> buf”不是有效地址。

如果我使用gdb调试此程序并在“entrust.cpp:6614”位置中断,则会正确显示FldOrder.cust_no.buf。

如何修复脚本?

1 个答案:

答案 0 :(得分:0)

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

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