TGTGInsighttelegram intelligenceLIVE / telegram public index
Post content
Post content
↓这篇文章很多年前就有朋友发给过我,今天又读了一遍,有两个细节很有趣: 1. 判断一个地址是否在栈上,竟然通过一次 syscall 去判断。当然这对 BPF 不能用。 2. Alex Dowad 给 musl libc 贡献的生成 CFI 的 awk,去看了一下,原来只是维护 sp 和 cfa 的距离,那还是相对容易,但对栈回溯也足够了。这其实很有趣,我其实在自己的一个小工具上就试图做在相似的事情。 作者最后结论是高性能栈回溯有三种思路:compact、硬件、bp-based。 稍作计算,如果能做前处理的话,struct task 又能找到 maps,以百万级 entry 来衡量的话,CFI-based bt 大概比 bp-based bt 慢 log2(1e6)=20 倍以上,确实令人担忧。 此外“前处理”的要求也很高,比如在容器化环境下不能提前拿到 ELF。而“后处理”对动态链接的 go ELF 又不能用,因为包含了动态栈和系统栈两部分。 但还是有一些新的思路,应该可以做一个更“通用” 的 BPF 回溯工具。