针对 IBM SDK for Node.js 的核心转储调试(3)
- UID
- 1066743
|
针对 IBM SDK for Node.js 的核心转储调试(3)
跟踪泄漏的一种方式是获取两个或更多具有较大时间差的转储文件,比较在两个转储文件之间执行一些命令的输出。
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显示指定地址上一个固定数组的元素find、findall、findnext在内存中查找一个字符串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 命令能够以最佳方式帮助您跟踪程序崩溃和内存泄漏的根源。 |
|
|
|
|
|