nodejs-0.4.2启动时的segfault(固定在v 0.4.5)

时间:2011-03-06 11:22:04

标签: node.js segmentation-fault

问候,为了节省您的时间,这个错误已在v0.4.5中修复 我今天在安装node.js时遇到了一个相当奇怪的问题,并通过邮件存档进行了筛选,但却无法解决它!所以我把问题发布到了nodejs here

只是提醒我从wscript改变了snapshot='snapshot=on' 节点到snapshot=''。 我这样做是因为在这之前我遇到了以下情况 make期间出错:

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

现在我要遵循的步骤。

*以root身份登录

---开始配置

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)

----配置结束

----开始make(编译好!!)

[为简洁省略输出]

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

'build' finished successfully (21.853s)

-----结束了

-----开始测试

/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 ---

... 所有后续测试都以类似的方式失败。

-----结束测试

----- make install的开始(我没有在前几次尝试中执行make test.it仅在我之后才使用它)

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 install

结束

我更新了PATH变量以包含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

从源代码构建时没有错误,我无法做到 找出问题所在。 我错过了一些明显的东西吗感谢。

2 个答案:

答案 0 :(得分:6)

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

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

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

然后查看/tmp/node.*文件,了解它在崩溃之前的作用。 修改strace(1)报告该程序发出的系统调用;当程序通过系统调用与外部世界交互时,它通常是查找错误的最快机制。 ltrace(1)报告动态库调用,这通常是关于程序内部工作的更多信息。两者都很有用。

其次,运行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输出进行比较,您可以猜测 far 如何进入segfault正在发生的函数,这在阅读源代码时可能会有所帮助。 (通过地址猜测你进入函数的程度是一个很长的过程,但我发现知道我是否应该看看函数的开头或结尾是否有用。)

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

valgrind nodejs script.js

Valgrind是一个令人印象深刻的工具,可能需要相当多的学习才能真正知道。我使用它的那个小,我印象深刻,但我不能像其他更简单的工具一样给予指导。

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

gdb --args nodejs script.js

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

幸运的是,您将被指向失败的确切函数,ltrace(1)将为您提供该函数的参数。这有望足以追踪具体的错误。

答案 1 :(得分:0)

nodejs-v0.4.5 中修复了

问题。根本没有麻烦。也许 nodejs-v0.4.2 中确实存在一个错误。