compile

汇编某个文件

你就能看到你 golang 语言对应的汇编代码了(注意了,命令处理的是 golang 代码文本),酷。

objdump
objdump

汇编代码这个东西在 90% 的场景可能都用不上,但是如果你处理过 c 的程序,在某些特殊场景,通过反汇编一段逻辑来推断应用程序行为将是你唯一的出路。因为线上的代码一般都是会开启编译优化,所以这里会导致你的代码对不上。再者,线上不可能让你随意 attach 进程,很多时候都是出 core 了,你就只有一个 core 文件去排查。

pprof

pprof 支持四种类型的分析:

  • 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