首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

针对 IBM SDK for Node.js 的核心转储调试-3

针对 IBM SDK for Node.js 的核心转储调试-3

查找内存泄漏内存泄漏可能是所有程序中的常见问题。IDDE 拥有多个命令来帮助跟踪哪些对象正在占用内存。在本例中,我们首先从我们认为存在内存泄漏的 Node.js                应用程序中获取一个核心转储文件。
跟踪泄漏的一种方式是获取两个或更多具有较大时间差的转储文件,比较在两个转储文件之间执行一些命令的输出。
jsmeminfo 命令有助于直观显示是否有非常大的对象正在使用大量空间,像本例中一样。
1
2
3
4
5
6
7
8
9
10
11
12
!jsmeminfo {

Memory allocator, used: 1423 MB, available: 0 MB
Total Heap Objects: 29497

Largest 5 heap objects  Type               Size (bytes)  More information         
----------------------  -----------------  ------------  --------------------------
0x0000000088a6d319      JS_OBJECT_TYPE          1311125  !jsobject 0x0000000088a6d319
0x0000000088aac6d9      FIXED_ARRAY_TYPE          98360  !array 0x000003ff88aac6d9
0x000003ff8abe31b9      ASCII_STRING_TYPE         48176  !string 0x000003ff8abe31b9
0x000003ff8ab34f09      ASCII_STRING_TYPE         48104  !string 0x000003ff8ab34f09
0x000003ff8ab04101      ASCII_STRING_TYPE         40936  !string 0x000003ff8ab04101




与  小节中一样,对此对象运行 jsobject                命令可以将它与您程序中的一个对象相关联并修复问题。
对于程序创建了许多对象但不处理它们的内存问题,jsgroupobjects                可将相同类型的对象分组到一起,并显示程序中有多少对象。jsgroupobjects 还有助于识别 Node.js                缓冲区在何处被用来显示对象的构造函数。(Node 中的缓冲区是分配超出堆范围的内存的一种方式。)在本例中,Buffer                是最常出现的对象:               
1
2
3
4
5
6
!jsgroupobjects {

Representative Object Address  Object Type    Num Objects Constructor  Num Properties  Properties                                                                     
-----------------------------  -------------  ----------  -----------  --------------  ---------------
!jsobject 0x000003ffec004101   JS_OBJECT_TYPE       2572      Buffer         2        length, parent
...




您可以通过识别缓冲区所分配的外部数组的位置(在以下输出中用粗体显示),在 IDDE 中打印缓冲区的内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
print 0x000003ffec004101 {

Object at 0x000003FFEC004101 is JSObject

Class hierarchy :-

|-JSObject
|  |- kElementsOffset 0x10 (EXTERNAL_UINT8_ARRAY_TYPE, !print 0x000003FFEC004159)
|  |- kPropertiesOffset 0x8 (FIXED_ARRAY_TYPE, !print 0x000003FF92A04111)
| |-JSReceiver
| | |-HeapObject
| | |  |- kMapOffset 0x0 (MAP_TYPE, !print 0x000003FF8BE1F6E9)
| | | |-Object
...




获取 kElementsOffset 的地址并提供给 array 数组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
!array 0x000003FFEC004159 {

Array type : EXTERNAL_UINT8_ARRAY_TYPE
Len : 10
0 0x48 H
1 0x65 e
2 0x6c l
3 0x6c l
4 0x6f o
5 0x20
6 0x6e n
7 0x6f o
8 0x64 d
9 0x65 e
..




objtypes 命令对解决内存问题也很有用。它显示了 V8 堆对象类型的计数和内存大小。
完整的命令参考列表以下是 IDDE 的完整的命令参考列表。这里用斜体显示的命令可用于任何核心转储文件;其他所有命令特定于 Node.js 转储文件:
array显示指定地址上一个固定数组的元素findfindallfindnext在内存中查找一个字符串frame显示单个 JavaScript 堆栈帧的详细信息help显示命令列表hexdump以十六进制和 ASCII 格式输出一个内存区段jsfindbyproperty找到具有指定属性的 JavaScript 对象jsgroupobjects列出共享同一个 Map 的 JavaScript 对象组jslistobjects列出具有指定的 V8 对象类型的堆对象jsmeminfo显示 JavaScript 内存使用信息,包括 5 个最大的对象jsobject显示 JavaScript 对象细节jsobjectsmatching打印与所提供的对象共享同一个 Map 的 JavaScript 对象jsstringsearch在堆上搜索某个指定的字符串locate在内存中搜索某个指定的字符串nodeoverview显示 Node 概述信息,包括版本objtype列出所有 V8 对象类型objtypes显示 V8 实例类型的堆栈使用分类信息print显示指定的堆栈对象的 C++ 分层结构ranges打印可用的内存范围列表stack显示某个给定线程的 JavaScript 堆栈轨迹string显示指定地址上的字符串threads列出所有线程结束语在本教程中,您学习了如何生成 Node.js 核心转储文件,在 IDDE 中打开该转储文件,在 IDDE                编辑器中输入并运行命令,获取可用于您的转储文件的所有命令的列表。您还了解了哪些 IDDE                命令能够以最佳方式帮助您跟踪程序崩溃和内存泄漏的根源。
返回列表