nodejs-0.4.2开始时的段错误(固定在v0.4.5)

问候,为了节省你的时间,这个bug在v0.4.5中得到了修复。我今天安装node.js时遇到了一个相当奇怪的问题,通过邮件归档筛选出来,但是却无法把它钉住。 所以我把问题发布到nodejs 这里

只是一个头,我改变snapshot='snapshot=on'从节点wscript到snapshot='' 。 我这样做是因为在做这个之前,我在make中遇到以下错误:

scons: *** [obj/release/snapshot.cc] Error -11

现在到我跟着的步骤。

*以root身份login

—开始configuration

 adil-X:/usr/local/nodejs/node-v0.4.2 # ./configure --prefix=/usr/local/nodejs Checking for program g++ or c++ : /usr/bin/g++ Checking for program cpp : /usr/bin/cpp Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for g++ : ok Checking for program gcc or cc : /usr/bin/gcc Checking for program ar : /usr/bin/ar Checking for program ranlib : /usr/bin/ranlib Checking for gcc : ok Checking for library dl : yes Checking for openssl : yes Checking for library util : yes Checking for library rt : yes --- libeio --- Checking for library pthread : yes Checking for function pthread_create : yes Checking for function pthread_atfork : yes Checking for futimes(2) : yes Checking for readahead(2) : yes Checking for fdatasync(2) : yes Checking for pread(2) and pwrite(2) : yes Checking for sendfile(2) : yes Checking for sync_file_range(2) : yes --- libev --- Checking for header sys/inotify.h : yes Checking for function inotify_init : yes Checking for header sys/epoll.h : yes Checking for function epoll_ctl : yes Checking for header port.h : not found Checking for header poll.h : yes Checking for function poll : yes Checking for header sys/event.h : not found Checking for header sys/queue.h : yes Checking for function kqueue : not found Checking for header sys/select.h : yes Checking for function select : yes Checking for header sys/eventfd.h : yes Checking for function eventfd : yes Checking for SYS_clock_gettime : yes Checking for library rt : yes Checking for function clock_gettime : yes Checking for function nanosleep : yes Checking for function ceil : yes Checking for fdatasync(2) with c++ : yes 'configure' finished successfully (2.239s) 

—-configuration结束

—-开始制作(这个编译好!)

[为简洁起见,省略输出]

Waf: Leaving directory /usr/local/nodejs/node-v0.4.2/build'

'build' finished successfully (21.853s)

—–结束

—–开始做testing

 /usr/bin/python "/usr/local/nodejs/node-v0.4.2/tools/scons/scons.py" - j 2 -C "/usr/local/nodejs/node-v0.4.2/build/default/" -Y "/usr/local/ nodejs/node-v0.4.2/deps/v8" visibility=default mode=release arch=ia32 toolchain=gcc library=static scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... scons: `library' is up to date. scons: done building targets. DEST_OS: linux DEST_CPU: ia32 Parallel Jobs: 2 Product type: program python tools/test.py --mode=release simple message [00:00|% 0|+ 0|- 0]: release test-pipe- head === release test- pipe-head === Path: simple/test-pipe-head Command: build/default/node /usr/local/nodejs/node-v0.4.2/test/simple/ test-pipe-head.js --- CRASHED --- 

…所有后续的testing都以类似的方式失败。

—–结束testing

—–开始安装(我没有执行前几个尝试maketesting,只是后来,我用它)

 adil-X:/usr/local/nodejs/node-v0.4.2 # make install Waf: Entering directory `/usr/local/nodejs/node-v0.4.2/build' DEST_OS: linux DEST_CPU: ia32 Parallel Jobs: 2 Product type: program * installing build/default/config.h as /usr/local/nodejs/include/node/ config.h * installing build/default/tools/nodejs.pc as /usr/local/nodejs/lib/ pkgconfig/nodejs.pc * installing build/default/node as /usr/local/nodejs/bin/node * installing build/default/src/node_config.h as /usr/local/nodejs/ include/node/node_config.h Waf: Leaving directory `/usr/local/nodejs/node-v0.4.2/build' 'install' finished successfully (0.122s) 

—– make安装结束

我更新了PATHvariables以包含nodejs bin。

现在nodejs在启动时崩溃,出现以下错误

 adil-X:/usr/local/nodejs/node-v0.4.2 # node example.js node.js:0 Segmentation fault 

仍然可以看到node.js版本

 adil-X:~ # node -v v0.4.2 

OS / Arch信息:

 adil-X:~ # cat /etc/*release LSB_VERSION="core-2.0-noarch:core-3.2-noarch:core-4.0-noarch:core-2.0- ia32:core-3.2-ia32:core-4.0-ia32" openSUSE 11.3 (i586) adil-X:~ # cat /proc/cpuinfo vendor_id :GenuineIntel cpu family : 6 model : 23 model name : Intel(R) Core(TM)2 Duo CPU T6500 @ 2.10GHz stepping : 10 cpu MHz : 1200.000 cache size : 2048 KB 

在从源代码构build的过程中没有任何错误,我无法找出问题所在。 我错过了明显的东西? 谢谢。

我可以build议一些机制来追踪这个问题。

首先,在nodejs上使用strace(1)ltrace(1)

 strace -o /tmp/node.strace -fF nodejs script.js ltrace -o /tmp/node.ltrace -f nodejs script.js 

然后查看/tmp/node.*文件,发现它在崩溃之前做了些什么。 编辑strace(1)报告程序所做的系统调用 ; 由于程序通过系统调用与外部世界进行交互,因此通常是发现错误的最快机制。 ltrace(1)报告dynamic库调用,这通常是关于程序内部工作的更多信息。 两者都很有用。

其次,运行dmesg > /tmp/dmesg并查看dmesg输出中的段错误信息,如下所示:

 [332430.652393] npviewer.bin[13508]: segfault at 418 ip 00000000f6086d16 sp 00000000ffd8b018 error 6 in libflashplayer.so[f5e19000+b5f000] 

这是一个Adobe Flash崩溃; 将地址与程序中的readelf -s输出进行比较,您可以猜测出segfault正在发生的function,这可能有助于阅读源代码。 (通过地址来猜测你到一个函数有多远,但是我发现知道是否应该看看函数的开始或结束是否有用)。

第三,你可以用valgrind(1)运行程序:

 valgrind nodejs script.js 

Valgrind是一个令人印象深刻的工具,可能需要相当数量的学习才能真正知道 。 我用过的那个小东西,给我留下了深刻的印象,但是我不能像其他更简单的工具那样给出像样的指导。

第四,你可以在gdb下运行nodejs

 gdb --args nodejs script.js 

当它死亡时,运行bt以获得回溯。 gdb也是一个令人印象深刻的程序,你也许可以find使用它的确切线路,但它也需要相当数量的学习才能真正知道 。 我很幸运,回溯通常足以发现错误。

幸运的是,你会指出失败的确切函数, ltrace(1)会给你这个函数的参数。 这将有望足以追查具体的错误。

问题固定在nodejs-v0.4.5中, 完全没有麻烦。 也许在nodejs-v0.4.2中确实有一个bug。