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

bpftrace 遍历 golang 链表(go17+) - liyan

在bpftrace 无侵入遍历golang链表里,笔者展示了使用bpftrace来遍历golang链表的方法。由于go-17go-16的函数调用规约存在不同,因此bpftrace 无侵入遍历golang链表并不适用于go-17。其实这个问题在go-1.17+ 调用规约已经提到了解决方案。本文给一个实例,算是更进一步的延伸这个话题,希望能够起到一些效果。

一、执行效果

$ sudo bpftrace ./link.bt
Attaching 1 probe...    // 在触发目标程序前,停止在这里
// 触发目标程序后,输出
== enter main.showNode
name: Alice, age: 11
name: Bob, age: 12
name: Claire, age: 13
== end// 目标程序执行结果
$ ./link
name: Alice, age: 11
name: Bob, age: 12
name: Claire, age: 13

需要注意的是,笔者的验证环境为:

Linux 4.18.0-193.el8.x86_64
go version go1.17 linux/amd64
bpftrace v0.14.0-72-g6761-dirty

由于不同的CPU架构下,寄存器的信息会有所不同。本文中所涉及的代码示例仅在amd64里有效。

二、代码

本文涉及两部分代码:目标的go代码以及bpftrace代码。

// link/main.go
package mainimport "fmt"type Node struct {Name stringAge  int64Next *Node
}//go:noinline
func showNode(head *Node) {var cur = headfor cur != nil {fmt.Printf("name: %s, age: %d
", cur.Name, cur.Age)cur = cur.Next}return
}func main() {var node = &Node{Name: "Alice",Age:  11,Next: &Node{Name: "Bob",Age:  12,Next: &Node{Name: "Claire",Age:  13,Next: nil,},},}showNode(node)
}

bpftrace代码为:

// link/link.bt
// 这里,符号使用双引号包裹起来是个好习惯
uprobe:./link:"main.showNode"
{printf("== enter main.showNode
");$head_ptr = reg("ax");unroll(10){$name_ptr = *(uint64*)($head_ptr+0);$name_len = *(uint64*)($head_ptr+8);$age_v = *(int64*)($head_ptr+16);printf("name: %s, age: %d
", str($name_ptr, $name_len), $age_v);// set head = next$head_ptr = *(uint64*)($head_ptr+24);if ($head_ptr == 0){printf("== end
");return;}}
}

以上。周末愉快。

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

相关文章:

  • 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实操视频教程合集
  • LeetCode:70. 爬楼梯
  • 青岛东泉环保智能设备有限公司电话查询:供应商联络方式与注意事项 - 品牌推荐
  • 零人类公司编排框架Paperclip的安装
  • CWT-CNN-GRU基于连续小波变换和卷积神经网络-门控循环单元故障诊断MATLAB代码
  • CSDN博客汇总(101-200篇)
  • OpenClaw 核心技术框架深度