针对 IBM SDK for Node.js 的核心转储调试(2)
- UID
- 1066743
|
针对 IBM SDK for Node.js 的核心转储调试(2)
尝试对该线程运行 stack 命令。threads 命令的输出中包含该命令的快捷键,所以您可以将光标放在包含 !stack 29897 的行的末尾处并按下 Ctrl+Space。这是输出(为了提高可读性,我们删除了参数列并截断了一些行):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
| !stack 29897 {
Instruction Pointer Frame Address Location / Frame Type
------------------- ------------------ ------------------------------------------------------------------------------------
0x0000000000eb112d 0x00007FFF0A81F960 node::_ZN2v84base2OS11GetUserTimeEPjS2_+0x9d
0x0000000000a890c1 0x00007FFF0A81FAC0 node::_ZN2v88internal7Isolate29CaptureAndSetSimpleStackTraceENS0_6HandleINS0_8JSO...
0x0000000000b63c9d 0x00007FFF0A81FAF0 node::_ZN2v88internal25Runtime_ThrowNotDateErrorEiPPNS0_6ObjectEPNS0_7IsolateE+0xdd
0x00000E7CAA2A8E32 0x00007FFF0A81FB40 main [/home/sian/test.js]
!jsobject 0x00001519ED09B451
0x00000E7CAA2A8B34 0x00007FFF0A81FB78 <anonymous> [/home/sian/test.js]
!jsobject 0x00001519ED09B341
0x00000E7CAA224AC6 0x00007FFF0A81FBE0 INTERNAL FRAME
0x00000E7CAA2A7D26 0x00007FFF0A81FC58 Module._compile [module.js]
!jsobject 0x00000DA39E6185F9
0x00000E7CAA2A220C 0x00007FFF0A81FCA0 Module._extensions..js [module.js]
!jsobject 0x00000DA39E618691
0x00000E7CAA29E940 0x00007FFF0A81FCE8 Module.load [module.js]
!jsobject 0x00000DA39E618569
0x00000E7CAA295565 0x00007FFF0A81FD70 Module._load [module.js]
!jsobject 0x00000DA39E6184D9
0x00000E7CAA294F24 0x00007FFF0A81FDB8 Module.runMain [module.js]
!jsobject 0x00000DA39E618721
0x00000E7CAA26B31F 0x00007FFF0A81FE28 startup [node.js]
!jsobject 0x0000079578AC8A61
0x00000E7CAA269D10 0x00007FFF0A81FE58 <anonymous> [node.js]
!jsobject 0x0000079578A6EF49
0x00000E7CAA21EF40 0x00007FFF0A81FE98 INTERNAL FRAME
0x00000E7CAA21DE90 0x00007FFF0A81FF20 ENTRY FRAME
0x00000E7CAA21DE90 0x00007FFF0A81FF20 ENTRY FRAME
0x0000000000914E28 0x00007FFF0A81FFF0 NONE FRAME
0x0000000000813bda 0x00007FFF0A820060 node::_ZN2v88Function4CallENS_6HandleINS_5ValueEEEiPS3_+0xba
0x0000000000c9d40f 0x00007FFF0A820190 node::_ZN4node15LoadEnvironmentEPNS_11EnvironmentE+0x1df
0x0000000000c9d67f 0x00007FFF0A8202E0 node::_ZN4node15LoadEnvironmentEPNS_11EnvironmentE+0x44f
0x0000003d0fa1ed5d 0x0000000000000000 node::_fini+0x3d0eb6c8c5
}
|
可以看到,崩溃发生在 main 方法中。要返回到代码来查看可能已发生的情况,不需要离开 IDDE;如果运行前面的输出中以粗体显示的命令,IDDE 会显示源代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
| !jsobject 0x00001519ED09B451 {
Object has fast properties
Number of descriptors : 5
Name Value More Information
--------- ------------------ -------------------------------
length 0x0000079578A0FE19 <EXECUTABLE_ACCESSOR_INFO_TYPE>
name 0x0000079578A0FE51 <EXECUTABLE_ACCESSOR_INFO_TYPE>
arguments 0x0000079578A0FE89 <EXECUTABLE_ACCESSOR_INFO_TYPE>
caller 0x0000079578A0FEC1 <EXECUTABLE_ACCESSOR_INFO_TYPE>
prototype 0x0000079578A0FEF9 <EXECUTABLE_ACCESSOR_INFO_TYPE>
Object is a function
Name: main
Source:
() {
var inputObject = {
input: ["one", "two", "three", "fifteen", "one hundred"],
counter:0,
};
for(; inputObject.counter< inputObject.input.length; inputObject.counter++) {
if (inputObject.input[inputObject.counter].length > 8) {
throw "Input String Too Big";
}
}
}
}
|
备注:此特性有助于确认您认为在运行的代码确实是实际运行的代码。
从代码中可以明显看到,mainObject.counter 肯定已经达到 4,它指向字符串 "one hundred",该字符串的长度大于 8。可以使用另外两个 IDDE 命令确认事实就是这样:jsfindbyproperty 和 jsobject。jsfindbyproperty 搜索堆中所有具有所提供的名称的属性的对象 — 在本例中为 counter。jsobject 显示了该对象的属性。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| !jsfindbyproperty counter {
!jsobject 0x00001519ED09B539
!jsobject 0x00001519ED09B689
}
!jsobject 0x00001519ED09B689 {
Object has fast properties
Number of descriptors : 2
Name Value More Information
------- ------------------ ---------------------------------------------
input 0x00001519ED09B6C1 <JS Array[5]> :- !jsobject 0x00001519ed09b6c1
counter 0x0000000400000000 SMI = 4
}
|
jsfindbyproperty 生成的十六进制数(例如 0x00003CF51F09B441)显示了该命令找到的对象的内存地址。可以对其中一个十六进制地址运行 jsobject 命令,如果某个 JavaScript 对象位于该地址中,该命令会打印出该对象的属性信息。在本例中,我们可以看到 counter 在此对象上达到了 4。
现在使用来自前面的输出的快捷键命令,查看 input 数组。
1
2
3
4
5
6
7
8
9
10
11
12
| !jsobject 0x00001519ed09b6c1 {
Array at !hexdump 0x00001519ED09B4E1
Array len = 5
0 : 0x00000CEAAC1A3679, one
1 : 0x00000CEAAC1A3699, two
2 : 0x00000CEAAC1A36B9, three
3 : 0x00000CEAAC1A36D9, fifteen
4 : 0x00000CEAAC1A36F9, one hundred
}
|
可以看到 test.js 代码中未通过测试并导致抛出了一个异常的数组元素。
查找内存泄漏内存泄漏可能是所有程序中的常见问题。IDDE 拥有多个命令来帮助跟踪哪些对象正在占用内存。在本例中,我们首先从我们认为存在内存泄漏的 Node.js 应用程序中获取一个核心转储文件。 |
|
|
|
|
|