分析Node.js核心转储的工具

25

如果我使用gcore对Node.js进程进行代码转储,最好的分析工具是什么?

灵感来源: 用于分析Java核心转储的工具

在我特定的情况下,我有兴趣调查一些内存泄漏问题,因此我非常想了解一些堆分析。 通用工具、甚至仪器包和技术也是受欢迎的。 我发现Node.js非常有趣,但运行时分析工具还不够完善。

3个回答

20

对于调查崩溃问题,我发现node-segfault-handler非常有用。这是一个模块,我编写它是为了在出现信号硬崩溃(比如NULL的反向引用导致SIGSEGV)时获取本地代码堆栈跟踪。

对于调查内存/分配问题,以下是迄今为止我收集到的一些数据:

1) Dave Patheco的博客文章 - 作者谈到使用插件来获取JS堆栈等信息。不幸的是,据我所知,该插件的源代码从未发布过(也没有二进制形式)。

2) 动态环境下的死后调试 - Dave Patheco撰写的ACM Queue文章(从博客文章链接过来)。虽然它提供了很好的背景阅读,但文章中并没有太多具体的工具和技术。

3) node-panic - 一种纯JS工具,用于在发生断言失败类型的崩溃时转储状态。无法帮助调试来自本地代码故障(SIGSEGV等)的崩溃。

4) Joyent: 调试生产系统 - Bryan Cantrill的演讲介绍了他推荐的工具和技术(感谢crickeys)。


1
刚刚看了这个(http://www.infoq.com/presentations/Debugging-Production-Systems)。我认为你必须在来自Joyent的SmartOS上运行,这样你才能在核心文件上使用mdb,但我不是很确定。 - crickeys
感谢提供的参考资料。MDB模块的源代码和二进制文件已经公开一年多了。它们内置于SmartOS(http://smartos.org/)中,在Joyent Public Cloud上也是内置的,源代码在github上(https://github.com/joyent/illumos-joyent/blob/master/usr/src/cmd/mdb/common/modules/v8/mdb_v8.c)。 - Dave Pacheco

11

在Linux和Mac上,您可以使用lldb调试器的插件llnode。该项目可在Github上的nodejs组织下获取:

https://github.com/nodejs/llnode

您可以通过Github从源代码安装,也可以在Mac上使用brew安装。Github上的readme文件应该可以帮助您安装,这里有一篇介绍性的博客文章:

https://developer.ibm.com/node/2016/08/15/exploring-node-js-core-dumps-using-the-llnode-plugin-for-lldb/

原始问题是关于内存分析的,使用v8 findjsobjectsv8 findjsinstances命令可以生成对象计数的基本直方图,并允许您列出每种类型的实例。

这里有一篇关于使用llnode进行内存分析的完整文章:http://www.brendangregg.com/blog/2016-07-13/llnode-nodejs-memory-leak-analysis.html


现在lldb支持这个功能,不必使用mdb,这太棒了。 - arboreal84

4

2017更新:现在你可以使用@h-hellyer的解决方案(llnode,基于lldb而非mdb)。https://dev59.com/mWoy5IYBdhLWcg3wN7UX#40045103

mdb + mdb_v8是一个好的选择。

为了使用mdb,您需要支持的操作系统。

现在,您很可能正在运行Linux。如果是这种情况:

第一部分:获取核心转储

您可以通过多种方式获得核心转储。 要从运行中的进程获取核心转储,可以执行以下操作:

pgrep -lf node # get pids
gdb -p your_pid

# once in gdb..
gcore  # this will output your core dump
detach # this will allow the process to continue to run.

第二部分:使用mdb

你可能了解Solaris、OpenSolaris、IllumOS或SmartOS,但更可能的情况是你不了解。如果你有时间设置SmartOS和mdb_v8,那就太好了。

如果没有,安装VirtualBox,然后安装autopsy。这将处理安装SmartOS以及将核心转储文件上传到虚拟机的仪式。

完成后,在你的mdb会话中,你可以按照这个演示文稿中的一些步骤进行操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接