当前位置: 首页 > news >正文

bpftrace 无侵入遍历golang链表 - liyan

执行结果

下面直接给出执行结果。可以看到,通过bpftrace脚本输出的结果与代码中实际遍历的结果相同。

sudo ./handle.bt  // 先启动监听
Attaching 1 probe...  // 启动后停止在这里
=== enter main.handle.  // 目标程序执行后输出
name: Alice
age : 10
name: Bob
age : 11
name: Claire
age : 12
=== total node: 3./demo  // 再执行目标程序
cur name: Alice, cur aget: 10
cur name: Bob, cur aget: 11
cur name: Claire, cur aget: 12

示例说明

系统环境如下:

Linux 4.18.0-193.6.3.el8_2.v1.2.x86_64
bpftrace v0.14.0-72-g6761-dirty
go version go1.16.15 linux/amd64

示例环境目录:

.
├── demo
├── go.mod
├── handle.bt
└── main.go

其中:

// main.go
package mainimport ("context""fmt"
)type Student struct {Name stringAge  int64// Comment [600]Byte 这样会使得这个问题变得很麻烦,hhhNext *Student
}// 添加如下配置以防止函数被编译优化掉
//go:noinline
func handle(ctx context.Context, student *Student) {for cur := student; cur != nil; cur = cur.Next {fmt.Printf("cur name: %s, cur aget: %d
", cur.Name, cur.Age)}return
}func main() {first := &Student{Name: "Alice",Age:  10,Next: &Student{Name: "Bob",Age:  11,Next: &Student{Name: "Claire",Age:  13,Next: nil,}}}handle(context.Background(), first)
}
// handle.bt
#!/bin/bpftrace// 当目标结构体较小时(使得整体栈开销 < 512Byte),可以直接构造使用
struct student{u64 name_ptr;u64 name_length;long  age;struct student *next;
};uprobe:./demo:"main.handle"
{printf("=== enter main.handle.
");$cur = (struct student *)sarg2;if ($cur == 0){printf("input param is nil.
");return;}$node_count = 1;unroll(10){  // 这里定义的最大节点数量为10printf("name: %s
", str($cur->name_ptr, $cur->name_length));printf("age : %d
", $cur->age);$cur = $cur->next;if ($cur == 0){printf("=== total node: %d
", $node_count);return;}$node_count += 1;}printf("==== meet max
");return;
}

在编译完成main.go后,通过sudo bpftrace -l "uprobe:./demo:*" > uprobe.info的方式,可以获取demo中所有可以attachuprobe信息。这里说明下取student*指针值时,为什么取sarg3bpftrace中对内存传参的参数支持是sarg0, sarg1, sarg2...,且每个参数实际只对应8Byte大小的空间。对于func handle(ctx context.Context, student *Student)函数来说,由于context.Context实际占用2*8Byte的空间(见golang常见类型字节数),因此需要使用sarg2来取student的值,而非直觉上的sarg1
整个过程比较简单、明了。只要拥有root权限,基本上可以对系统内的任何进程进行详细的分析。

http://www.jsqmd.com/news/481766/

相关文章:

  • 恒企专修学院电话查询:选择培训机构的风险提示 - 品牌推荐
  • 导师推荐 8个降AIGC工具:多场景适配+降AI率全测评
  • 大模型开发入门到进阶:从入门到实战,4阶段完整路径,带你掌握大模型开发!
  • 30天硬核!从0到精通大模型开发,高薪风口等你来抓!
  • 毕业论文神器 9个AI论文网站深度测评:本科生开题报告与学术写作必备工具
  • bpftrace 遍历 golang 链表(go17+) - liyan
  • c++插件管理--pluma实践 - liyan
  • 四周速成!从零掌握AI大模型,内含实战项目与学习计划_30天大模型开发速成
  • 09 部署与成本控制:Serverless 架构下 Agent 的 Token 优化艺术
  • 老王-城府不是心机而是清醒的边界感
  • BPF 获取 LVS FullNat 模式下的 Client IP - liyan
  • 解决RDK X5(ARM64架构)板卡Remote-SSH运行Antigravity AI崩溃(SIGILL):Samba网络盘本地挂载方案
  • 强烈安利! AI论文工具,千笔AI VS 灵感风暴AI,专科生必备神器!
  • centos 安装docker并构建golang镜像 - liyan
  • 狡猾的北狐狸
  • 老王-三观稳则人生稳
  • centos 构建 local-k8s - liyan
  • 老王-老祖宗没说完的后半句
  • 2026涂塑钢管市场评测:哪些公司口碑较好?IPN8710防腐钢管/圆孔滤水钢管 ,涂塑钢管制造厂家推荐排行榜单 - 品牌推荐师
  • 老王-缺心眼是边界感缺失
  • clisp编译 - liyan
  • 老王-家兴不在运在德
  • challenges of bpf tracing go - liyan
  • 泛型体系实战
  • 电机设计仿真:Maxwell ANSYS 五相电机设计
  • Openclaw 附录B 常用Skills清单
  • 053店铺租赁租凭平台系统-springboot+vue
  • Openclaw 附录C 配置模板与自定义参考
  • babyRE
  • 云上OpenClaw实操视频教程合集