我们可以像内核空间中的函数一样为用户空间函数转储函数参数吗?如果我们执行 dtrace -l -f -v,FBT 提供程序可以转储用户空间函数的参数吗?
我是 DTrace 的“top”实用程序,(“top”实用程序在目标文件中内置了 CTF 和 Dwarf 调试部分)
我正在尝试检查由“top”调用的 get_system_info 函数,我确认它存在待探测
root% dtrace -l | grep get_system_info
55154 pid8488 top get_system_info entry
但我不能将参数转储给函数......
root% dtrace -l -f get_system_info -v
ID PROVIDER MODULE FUNCTION NAME
55154 pid8488 top get_system_info entry
Probe Description Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: Unknown
Argument Attributes
Identifier Names: Private
Data Semantics: Private
Dependency Class: Unknown
Argument Types
None
用一个简单的脚本进行测试,
pid8488::get_system_info:entry
{
this->info = (struct system_info *)copyin(args[0], sizeof(struct system_info));
}
...如果我使用 args[0] 表示法,它会显示以下内容,
dtrace: failed to compile script top_d.d: line 17: index 0 is out of
range for pid8488::get_system_info:entry args[ ]
相反,如果我用 arg0 替换,它会编译,但值不一定是健全的。示例 struct system_info 的 ncpus 成员显示垃圾值。
完整的脚本是
pid8488::get_system_info:entry
{
this->info = (struct system_info *)copyin(arg0, sizeof(struct system_info));
printf("last pid [%d] \n", this->info->last_pid);
}
pid8488::get_process_info:entry
{
this->info = (struct system_info *)copyin(arg0, sizeof(struct system_info));
printf("ncpus [%d] \n", this->info->ncpus);
}
运行这个
55154 get_system_info:entry last pid [8513]
55155 get_process_info:entry ncpus [134558720]
应该显示cpu数量?脚本有什么问题吗?