汇编某个文件
你就能看到你 golang 语言对应的汇编代码了(注意了,命令处理的是 golang 代码文本),酷。
objdumpobjdump
汇编代码这个东西在 90% 的场景可能都用不上,但是如果你处理过 c 的程序,在某些特殊场景,通过反汇编一段逻辑来推断应用程序行为将是你唯一的出路。因为线上的代码一般都是会开启编译优化,所以这里会导致你的代码对不上。再者,线上不可能让你随意 attach 进程,很多时候都是出 core 了,你就只有一个 core 文件去排查。
pprofpprof 支持四种类型的分析:
CPU :CPU 分析,采样消耗 cpu 的调用,这个一般用来定位排查程序里耗费计算资源的地方;
Memroy :内存分析,一般用来排查内存占用,内存泄露等问题;
Block :阻塞分析,会采样程序里阻塞的调用情况;
Mutex :互斥锁分析,采样互斥锁的竞争情况;
我们这里详细以内存占用分析举例(其他的类似),pprof 这个是内存分析神器。基本上,golang 有了这个东西,99% 的内存问题(比如内存泄露,内存占用过大等等)都是可以非常快的定位出来的。首先,对于 golang 的内存分析(或者其他的锁消耗,cpu 消耗)我们明确几个重要的点:
mProf_MallocmProf_Free
详细原理,可以复习另一篇文章:内存分析;
分析的形式有两种:
net/http/pporfgo tool
go tool pprof ./xxxo
我写了一个 demo 程序,然后 dump 出了一份 heap 的 pprof 采样文件,我们先通过这个 pprof 得出一些结论,最后我再贴出源代码,再品一品。
这个 top 信息表明了这么几点信息:
main.funcAmain.funcBmain.funcCmain.funcAmain.funcAmain.funcBmain.funcBmain.funcCmain.funcCmain.main
demo 的源代码:
dump 命令:
对照着代码,再品一品。
trace程序 trace 调试
go tool trace