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安装结束
我更新了PATH
variables以包含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。