使用 Dtrace 进行 Node.js 分析未显示函数名称

Posted

技术标签:

【中文标题】使用 Dtrace 进行 Node.js 分析未显示函数名称【英文标题】:Node.js profiling with Dtrace not showing functions names 【发布时间】:2013-05-17 19:17:34 【问题描述】:

我正在尝试使用 DTrace 分析我的 project 的 CPU 利用率。我刚刚关注了script

问题在于它没有显示函数名称。 stacks.out 文件如下所示:

 CPU     ID                    FUNCTION:NAME
   0  73700                        :tick-60s 


          node`_ZN2v86Object3GetENS_6HandleINS_5ValueEEE+0x1
          node`_ZN4node7TCPWrap12OnConnectionEP11uv_stream_si+0x14b
          node`uv__server_io+0xbf
          node`uv__io_poll+0x259
          node`uv_run+0xda
          node`_ZN4node5StartEiPPc+0x16d
          node`main+0x1b
          node`_start+0x83
            1

          node`_ZN4node6Buffer4FillERKN2v89ArgumentsE+0x22b
          0x82474d1b
          0x8241ee9c
          0x8241e624
          0x8241e30f
          0x82426abd
          0x82419e4e
          0x82419948
          0x82413fc3
          0x8d20e501
          0x82416f65
          0x82413f98
          0x8243e7d3
          0x824186c0
          0x8246e8cf
          0x8d221899
          0x8d21308a
          node`_ZN2v88internalL6InvokeEbNS0_6HandleINS0_10JSFunctionEEENS1_INS0_6ObjectEEEiPS5_Pb+0x101
          node`_ZN2v88internal9Execution4CallENS0_6HandleINS0_6ObjectEEES4_iPS4_Pbb+0xc9
          node`_ZN2v88Function4CallENS_6HandleINS_6ObjectEEEiPNS1_INS_5ValueEEE+0x10b
          node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_8FunctionEEEiPNS1_INS0_5ValueEEE+0x4c
          node`_ZN4node12MakeCallbackEN2v86HandleINS0_6ObjectEEENS1_INS0_6StringEEEiPNS1_INS0_5ValueEEE+0x66
          node`_ZN4node10StreamWrap12OnReadCommonEP11uv_stream_si8uv_buf_t14uv_handle_type+0x14f
          node`_ZN4node10StreamWrap6OnReadEP11uv_stream_si8uv_buf_t+0x2e
          node`uv__read+0x281
          node`uv__stream_io+0x131
          node`uv__io_poll+0x259
          node`uv_run+0xda
          node`_ZN4node5StartEiPPc+0x16d
          node`main+0x1b
          node`_start+0x83
            1

火焰图将十六进制(即“0x82474d1b”)显示为函数调用,而不是实际的函数名称。

我正在使用 Omnios(基于 illumos 的操作系统)vagrant box r151002 并这样做 (https://gist.github.com/dalssoft/5595688) 在 OmniOS 上构建 node.js 32 位。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我在撰写有关同时使用 openindiana 和 node.js 的博客文章时遇到了类似的问题。

http://blog.nearform.com/blog/node-openindiana.html

我发现明确使用 cpu 架构是解决它的方法。

./configure --with-dtrace --dest-cpu=x64

别忘了也解开 c++ 符号

c++filt < stacks.out > demangled.out

【讨论】:

酷!会尝试一下,然后我告诉你它是否适用于 OmniOS :) 为了以后参考,前面的博文好像已经移到这里了:nearform.com/nodecrunch/node-openindiana 再次移动。参考archive.org:web.archive.org/web/20130717020412/http://blog.nearform.com/… 把它也放在我自己的网站上venshare.com/2014/09/21/node-js-on-open-indiana 谢谢你的碰撞

以上是关于使用 Dtrace 进行 Node.js 分析未显示函数名称的主要内容,如果未能解决你的问题,请参考以下文章

与命令行相比,来自 C 的 Dtrace 不会产生相同的分析结果

我们可以使用 dtrace 对每个内核进行分析吗?

dtrace 脚本输出是啥意思?

如何使用 dtrace 进行挂钟分析?或者,如何使用配置文件提供程序计算进程未运行的样本?

使用 dtrace 分析 C 代码

使用 DTrace 在 Rust 上获取堆栈跟踪/分析数据