#golang

基于ebpf实现的gls

虽然golang并不推荐使用goid来构建gls(goroutine local storage),仍然有着很多的实现gls并使用的尝试。github-gls这里是一个常见的实现,基本表述了golanggls的实现思路:获取goid,基于goid构建一个存储。本文中笔者尝试基于ebpf来构建一个golanggls

基本功能

本文中基于ebpf实现的gls具有如下功能:

  • 基于goid的存储。即map[goid]=value
  • 基于goroutine派生关系设置的value缺省值。即map[goid=1]=121,且goid=1派生goid=2,则map[goid=2]=map[goid=1]=121
    本文建议参照黑魔法-ebpf-对用户空间数据的写入进行理解。
·3min·李岩
基于ebpf实现的gls

bpftrace 无侵入遍历golang链表

bpftrace 基于 bcc 进行开发的工具,语法简洁、功能强大。用其分析Linux 环境下的程序会很方便。本文构造了一个入参为链表头节点的函数使用场景,通过使用bpftrace无侵入遍历链表成员的方式,介绍bpftrace attach uprobe 的使用。更多使用说明见:bpftrace官网使用文档

·2min·李岩
bpftrace 无侵入遍历golang链表

golang 常见类型字节数

ebpf 分析golang程序时,离不开对参数大小的判断。这里列出来一些基本类型的大小,并通过汇编对应验证函数的方式来肯定判断结果。

信息

这里列出基本类型及其作为参数传递时,占用的空间大小如下表。

类型长度说明
指针8B64位机为 8Byte, 32位机位4Byte
context16Binterface 类型。其中,前8B是类型信息,后8B是对象的指针信息
interface16B2 个指针,详见draveness-go-interface,或者 runtime/runtime2.go iface/eface 定义
int648B-
int8B64位机为 8Byte, 32位机位4Byte
string16B8B 地址 + 8B string长度
slice24B8B地址 + 8B slice 成员数量 + 8B slice capability
func8Bfunc 作为函数参数时,传递的是 func 的地址

需要注意的是,作为函数参数传递时,golang会对参数按照 8B 进行对齐。

·2min·李岩
golang 常见类型字节数

emacs-若干语言 lsp 配置备注

微软推出的language server protol 确实提升了文本编辑器的使用体验。就 emacs 的使用而言,配合各个语言的 lsp 实现,能够减少配置语言开发环境的难度。这里记录一下使用 emacs 中的 rust, golang, python, c/c++ lsp 配置

·4min·李岩
emacs-若干语言 lsp 配置备注

go-simplejson 插入数组

go-simplejson是go lang语言中操作json非常方便的开源库。最近使用simplejson进行数据插入操作时遇到了问题,经过排查后最终解决。现记录如下。

·1min·李岩
go-simplejson 插入数组