我编写了一个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。
如何修复脚本?
答案 0 :(得分:0)
问题可能是您的标识符FldOlder
只是一个脚本变量,该标准将解释为初始化值为零的整数。 @cast
表达式隐藏指针算法以获取0x00000075
地址 - 如果您打印& ((CFldOlder*)0)->cust_no->buf
,这正是您在C ++中获得的。
要修复脚本,请传递@cast
有效指针。您可能意味着上下文变量$FldOlder
。如果变量的类型已经是@cast
,您甚至可能不需要reinterpret_cast<>
(其工作方式类似于C ++ CFldOlder*
。)