如果我使用gcore来创建Node.js进程的代码转储,那么分析它的最佳工具是什么?
灵感来自: Tool for analyzing java core dump
在我的具体情况下,我有兴趣调查一些内存泄漏,所以我真的很想得到一些堆分析。一般工具甚至仪器包和技术也是受欢迎的。我发现Node.js非常有趣,但运行时分析工具还没有。
答案 0 :(得分:16)
对于调查崩溃,我发现node-segfault-handler非常宝贵。这是我用来获取本机代码堆栈跟踪的模块,在发生信号硬崩溃的情况下 - 例如,导致SIGSEGV的NULL的deref
为了调查内存/分配问题,这里是我迄今为止收集的一些数据:
1)Blog post by Dave Patheco - 作者讨论了使用插件到MDB来获取JS堆栈等。可悲的是,据我所知,该插件的来源从未发布过(也没有任何二进制形式)。
2)Postmortem Debugging in Dynamic Environments - ACM Queue文章也由Dave Patheco撰写(链接自博客文章)。虽然它有很好的背景阅读,但文章中没有很多具体的工具和技术。
3)node-panic - 一个纯JS工具,用于在发生断言失败类型崩溃时转储状态。什么都没有帮助调试源自本机代码错误(SIGSEGV等)的崩溃
4)Joyent: Debugging Production Systems - 由Bryan Cantrill谈论他推荐的工具和技术(thx crickeys)。
答案 1 :(得分:8)
在Linux和Mac上,你可以使用llnode lldb调试器的插件。该项目在github上的nodejs组织下可用:
https://github.com/nodejs/llnode
您可以通过github从源代码安装或在Mac上使用brew。 github上的自述文件应该可以帮助你安装它,并且这里有一篇介绍性的博客文章:
最初的问题是关于内存分析,v8 findjsobjects
和v8 findjsinstances
命令将通过生成对象计数的基本直方图并允许您列出每种类型的实例来帮助实现。
这里有一篇关于使用llnode进行内存分析的完整文章: http://www.brendangregg.com/blog/2016-07-13/llnode-nodejs-memory-leak-analysis.html
答案 2 :(得分:3)
2017更新:现在您可以使用@ h-hellyer的解决方案(llnode,基于lldb而不是mdb)。 https://stackoverflow.com/a/40045103/3221630
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.
您可能了解Solaris,OpenSolaris,IllumOS或SmartOS。最有可能的情况并非如此。如果你能负担得起设置SmartOS和mdb_v8的时间,那就好了。
如果没有,请安装VirtualBox,然后安装autopsy。这将处理安装SmartOS以及将核心转储文件上载到VM的过程。
完成后,当您进入mdb会话时,可以按照此presentation中的一些步骤进行操作。