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

针对 IBM SDK for Node.js 的核心转储调试(2)

针对 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                应用程序中获取一个核心转储文件。
返回列表