说明:1.这个脚本可能会导致内核panic,所以一定不要在生产环境中使用,切记!
2.这个脚本不具备通用性,如果你使用了lxc或者cgroup,获得的结果可能有误或者找不到
3.这个脚本只是提供了找到socket实例的方法,如果你想获取这个套接字的其他信息需要自己编写脚本,
通
过获得的socket实例来获取。插入的位置在脚本中已标注,可以直接插入代码或函数。如果你对
SystemTap比较熟悉的话可以自己灵活地修改。
思路很简单,
根据pid查找对应的task_struct结构实例,然后找到打开文件描述符表,查找fd对应的file结构实例。如果fd是套接字,socket结构实例保存在file结构的private_data成员中。在从private_data成员中获取数据前,会检查文件的操作是否指向socket_file_ops,但是该成员没有导出,所以脚本中没有这个校验,由使用者自己来保证指定的fd是套接字。
脚本如下所示:
%{
# include <linux /fdtable.h >
# include <linux /file.h >
# include <net /inet_connection_sock.h >
%}
%{
int err = 0, fput_needed = 0;
%}
function stap_fget_light(fd_param : long, pid_param : long) %{
int fd = STAP_ARG_fd_param;
# include <linux /fdtable.h >
# include <linux /file.h >
# include <net /inet_connection_sock.h >
%}
%{
int err = 0, fput_needed = 0;
%}
function stap_fget_light(fd_param : long, pid_param : long) %{
int fd = STAP_ARG_fd_param;