针对 IBM SDK for Node.js 的核心转储调试(1)
- UID
- 1066743
|
针对 IBM SDK for Node.js 的核心转储调试(1)
生成核心转储文件生成核心转储文件的方法在不同系统中有所不同。Joyent(Node.js 的企业管理人)推荐使用 --abort-on-uncaught-exception 标记运行所有生产级 Node.js 系统。在 UNIX 系统上,还需要设置 ulimit -c unlimited 来支持生成没有大小限制的核心文件。
扩展 IDDE 支持IDDE 支持探索和调试 IBM Java 核心转储已有多年。随着 2013 年 IBM SDK for Node.js 的发布,支持在 IDDE 1.2 版中添加 Node.js。IDDE 1.2.2 还添加了对 IBM SDK for Node.js 1.2.x 版(等效于 Node 0.12.x)的支持。
如果没有抛出异常,则需要使用系统工具(比如 LInux 上的 gcore 或 AIX 上的 gencore)来生成核心文件,或者使用 kill -11 结束进程。在 Windows 7 和更高版本上,可以使用任务管理器来生成核心转储文件:按下 Ctrl+Alt+Delete 并选择 Start Task Manager。从 Processes 选项卡中,右键单击 Node.js 进程并选择 Create Dump File。还可以使用用于 Windows 的免费的 实用程序。
调试崩溃为了生成程序崩溃,我们将使用 Test.js 脚本。这个简单脚本循环 5 次,然后抛出一个错误。
清单 1. Test.js1
2
3
4
5
6
7
8
9
10
11
12
13
14
| function main() {
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";
}
}
}
main();
|
可在 Linux 上像这样运行 test.js:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| $ cd node-v0.12.4-linux-x64/bin/
$ ulimit -c unlimited
$ ./node --abort-on-uncaught-exception ../../test.js
Uncaught Input String Too Big
FROM
main (/home/sian/test.js:11:7)
Object.<anonymous> (/home/sian/test.js:16:1)
Module._compile (module.js:460:26)
Object.Module._extensions..js (module.js:478:10)
Module.load (module.js:355:32)
Function.Module._load (module.js:310:12)
Function.Module.runMain (module.js:501:10)
startup (node.js:129:16)
node.js:814:3
Illegal instruction (core dumped)
|
在 IDDE 中打开一个核心转储文件如果 IDDE 已安装,并在核心转储文件所在的相同计算机上运行,您可以直接从磁盘位置打开核心转储文件。右键单击 PD Navigator View(PD 表示问题判定)并选择 New PD Artifact。
图 1. 选择 New PD Artifact浏览到您的核心转储文件的位置并单击 Finish。
要在另一个计算机上打开该转储文件,可以使用常用工具复制该转储文件,然后采用我们刚才介绍的方法在第二个系统上的 IDDE 中打开它。要在将转储文件复制到不同的位置或不同的计算机时实现更好的原生堆栈轨迹,还可以将 Node 可执行程序复制到同一个目录来启用要解析的符号。
您现在需要使用 IDDE 编辑器。从您的新核心文件下选择 Start Investigation 来打开该编辑器。
图 2. 打开 IDDE 编辑器。大型转储文件可能需要更多的时间来完成加载。
IDDE 命令它有助于将 IDDE 编辑器视为编辑器与控制台的一种混合体。您可以像使用控制台一样在 IDDE 编辑器中输入并运行命令,但您的进度保存在编辑器中。
要运行命令,必须在命令的前面添加 ! 并按下 Ctrl+Enter。例如,输入 !help 并按下 Ctrl+Enter 会输出帮助消息,其中列出了处理转储的其他可用命令。Node 命令集与 Java 集不同,甚至对于不同的 Node 版本(或 Java)可能也会有所不同,因为新的 IDDE 版本中不断添加新的命令。
与其他 Eclipse 编辑器一样,Ctrl+Space 会显示完成建议,这在 IDDE 编辑器中就是命令列表。
图 3. 使用 Ctrl+Space 打开的命令列表一个首先使用的不错命令是 nodeoverview,它提供了您运行的 Node 版本、依赖关系等的基本摘要。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| !nodeoverview {
Node Property Value
---------------------- -------------------------------------------------------------
Node version 0.12.4
Path to executable /home/sian/node-v0.12.4-linux-x64/bin/node
Architecture x64
Platform linux
Command Line Arguments /home/sian/node-v0.12.4-linux-x64/bin/node /home/sian/test.js
Execution Arguments --abort-on-uncaught-exception
Process ID 5643
Dependency Version
----------- ----------
http_parser 2.3
node 0.12.4
v8 3.28.71.19 2.2
[...]
|
调查问题从前面的控制台输出中可以看出,该程序将会崩溃并抛出了一个 uncaught 异常,所以在这里要做的第一件事就是查看堆栈轨迹。运行 threads 命令查找线程 ID。
1
2
3
4
5
6
| !threads {
Thread ID: 0x74c9 (29897) IP: 0x0000000000eb112d
!stack 29897
}
|
只有一个线程在运行,所以它一定是 JavaScript 线程。 |
|
|
|
|
|