如果我使用gcore对Node.js进程进行代码转储,最好的分析工具是什么?
灵感来源: 用于分析Java核心转储的工具
在我特定的情况下,我有兴趣调查一些内存泄漏问题,因此我非常想了解一些堆分析。 通用工具、甚至仪器包和技术也是受欢迎的。 我发现Node.js非常有趣,但运行时分析工具还不够完善。
如果我使用gcore对Node.js进程进行代码转储,最好的分析工具是什么?
灵感来源: 用于分析Java核心转储的工具
在我特定的情况下,我有兴趣调查一些内存泄漏问题,因此我非常想了解一些堆分析。 通用工具、甚至仪器包和技术也是受欢迎的。 我发现Node.js非常有趣,但运行时分析工具还不够完善。
对于调查崩溃问题,我发现node-segfault-handler非常有用。这是一个模块,我编写它是为了在出现信号硬崩溃(比如NULL的反向引用导致SIGSEGV)时获取本地代码堆栈跟踪。
对于调查内存/分配问题,以下是迄今为止我收集到的一些数据:
1) Dave Patheco的博客文章 - 作者谈到使用插件来获取JS堆栈等信息。不幸的是,据我所知,该插件的源代码从未发布过(也没有二进制形式)。
2) 动态环境下的死后调试 - Dave Patheco撰写的ACM Queue文章(从博客文章链接过来)。虽然它提供了很好的背景阅读,但文章中并没有太多具体的工具和技术。
3) node-panic - 一种纯JS工具,用于在发生断言失败类型的崩溃时转储状态。无法帮助调试来自本地代码故障(SIGSEGV等)的崩溃。
4) Joyent: 调试生产系统 - Bryan Cantrill的演讲介绍了他推荐的工具和技术(感谢crickeys)。
在Linux和Mac上,您可以使用lldb调试器的插件llnode。该项目可在Github上的nodejs组织下获取:
https://github.com/nodejs/llnode
您可以通过Github从源代码安装,也可以在Mac上使用brew安装。Github上的readme文件应该可以帮助您安装,这里有一篇介绍性的博客文章:
原始问题是关于内存分析的,使用v8 findjsobjects
和v8 findjsinstances
命令可以生成对象计数的基本直方图,并允许您列出每种类型的实例。
这里有一篇关于使用llnode进行内存分析的完整文章:http://www.brendangregg.com/blog/2016-07-13/llnode-nodejs-memory-leak-analysis.html
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.
你可能了解Solaris、OpenSolaris、IllumOS或SmartOS,但更可能的情况是你不了解。如果你有时间设置SmartOS和mdb_v8,那就太好了。
如果没有,安装VirtualBox,然后安装autopsy。这将处理安装SmartOS以及将核心转储文件上传到虚拟机的仪式。
完成后,在你的mdb会话中,你可以按照这个演示文稿中的一些步骤进行操作。