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

如果我使用gcore来创buildNode.js过程的代码转储,那么分析它的最佳工具是什么?

启发: 分析Java核心转储的工具

在我的具体情况,我有兴趣调查一些内存泄漏,所以我真的好奇,得到一些堆分析。 一般的工具,甚至仪器包和技术也是受欢迎的。 我发现Node.js是非常有趣的,但运行时分析工具还没有。

为了调查崩溃,我发现node-segfault处理程序是非常宝贵的。 这是一个我熟悉的模块,在发生硬件崩溃的情况下得到一个本地代码堆栈跟踪 – 例如deref为NULL,导致SIGSEGV

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

1) 由Dave Patheco撰写的博客文章 – 作者讨论了如何使用MDB的插件获取JS堆栈等。 可悲的是,据我所知,该插件的来源从未被释放(也没有任何二进制forms)。

2) 在dynamic环境中进行事后debugging-ACM队列文章也是由Dave Patheco编写的(从博客文章链接而来)。 虽然它为大背景的阅读,文章没有很多具体的工具和技术。

3) node-panic – 在发生断言失败types崩溃事件时用于转储状态的纯JS工具。 没有什么能帮助debugging源于本地代码错误的崩溃(SIGSEGV等)

4) Joyent:debugging生产系统 – Bryan Cantrill谈论他所推荐的工具和技术(thc crickeys)。

在Linux和Mac上,您可以使用lldbdebugging器的llnode插件。 该项目在github上的nodejs组织下可用:

https://github.com/nodejs/llnode

你可以通过github从源码安装,或者在Mac上使用brew。 github上的自述文件可以帮助你安装,这里有一篇介绍性的博客文章:

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

最初的问题是关于内存分析,而v8 findjsobjectsv8 findjsinstances命令将通过生成对象计数的基本直方图并允许列出每种types的实例来帮助您。

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

2017更新:现在你可以使用@ h-hellyer的解决scheme(llnode,基于lldb而不是mdb)。 https://stackoverflow.com/a/40045103/3221630

mdb + mdb_v8是要走的路。

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

现在,你很可能会在Linux上运行。 如果这是你的情况:

第1部分。得到你的核心转储

你可以通过很多方式获得核心转储。 要从正在运行的进程中获得核心转储,可以这样做:

 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. 

第2部分。使用mdb

您有机会了解Solaris,OpenSolaris,IllumOS或SmartOS。 情况并非如此。 如果你能负担得起设置SmartOS和mdb_v8的时间,那就好了。

如果没有,请安装VirtualBox,然后进行validation 。 这将处理安装SmartOS的仪式以及将核心转储file upload到VM。

一旦你完成了,当你在你的mdb会话,你可以按照这个演示文稿的一些步骤。