<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>火焰图 on KK的博客</title><link>https://spin6lock.github.io/tags/%E7%81%AB%E7%84%B0%E5%9B%BE/</link><description>Recent content in 火焰图 on KK的博客</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Sun, 24 May 2020 00:00:00 +0800</lastBuildDate><atom:link href="https://spin6lock.github.io/tags/%E7%81%AB%E7%84%B0%E5%9B%BE/feed.xml" rel="self" type="application/rss+xml"/><item><title>skynet 火焰图的新方法</title><link>https://spin6lock.github.io/2020/05/24/skynet%E7%81%AB%E7%84%B0%E5%9B%BE%E7%9A%84%E6%96%B0%E6%96%B9%E6%B3%95.html</link><pubDate>Sun, 24 May 2020 00:00:00 +0800</pubDate><guid>https://spin6lock.github.io/2020/05/24/skynet%E7%81%AB%E7%84%B0%E5%9B%BE%E7%9A%84%E6%96%B0%E6%96%B9%E6%B3%95.html</guid><description>&lt;p&gt;最近 &lt;a href="https://rainbowcoder.com/"&gt; 子熏同学 &lt;/a&gt; 搞定了新的抓取火焰图的方法，他觉得改动有点多，不方便开源出来，不过我觉得思路很好，写篇文章记录一下&lt;/p&gt;&#10;&lt;p&gt;skynet 自带的魔改版 Lua，即使 Lua 代码在死循环，也能通过 gm 指令让 vm 停下来，看看出事的地方是哪里。这是通过引入 lua_checksig_ 来实现的。在 lvm.c 里，重点的几个 OPCODE: &lt;code&gt;OP_JMP&lt;/code&gt;, &lt;code&gt;OP_CALL&lt;/code&gt;, &lt;code&gt;OP_TAILCALL&lt;/code&gt;, &lt;code&gt;OP_FORLOOP&lt;/code&gt; 都会调用 lua_checksig 进行检查，如果设置了开关，就会通过 lua_error 中止运行。新的火焰图也是用类似方法实现，当目标服务检测到开关打开，就会将当前栈帧到 base_ci 的部分抓取下来，序列化成文本，放进一个全局指针里。然后另一个服务就会去读这个指针，将数据序列化到文件里，后续用 flamegraph.pl 进行火焰图的渲染&lt;/p&gt;</description></item></channel></rss>