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

Adi*_*ood 1 segmentation-fault node.js

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

只是我snapshot='snapshot=on'从Node中的wscript 更改为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)
Run Code Online (Sandbox Code Playgroud)

----配置结束

----开始制作(编译好!!)

[为简洁省略输出]

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 ---
Run Code Online (Sandbox Code Playgroud)

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

-----结束测试

----- 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)
Run Code Online (Sandbox Code Playgroud)

-----安装结束

我更新了PATH变量以包含nodejs bin.

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

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

node.js:0
Segmentation fault
Run Code Online (Sandbox Code Playgroud)

不过,我可以看到node.js版本

adil-X:~ # node -v
v0.4.2
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

在从源代码构建的过程中没有错误,我无法弄清楚问题.我错过了一些明显的东西吗 谢谢.

sar*_*old 6

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

首先,使用strace(1)ltrace(1)nodejs:

strace -o /tmp/node.strace -fF nodejs script.js
ltrace -o /tmp/node.ltrace -f nodejs script.js
Run Code Online (Sandbox Code Playgroud)

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

其次,运行dmesg > /tmp/dmesg并查看dmesgsegfault信息的输出,它看起来像这样:

[332430.652393] npviewer.bin[13508]: segfault at 418 ip 00000000f6086d16 sp 00000000ffd8b018 error 6 in libflashplayer.so[f5e19000+b5f000]
Run Code Online (Sandbox Code Playgroud)

这是一个Adobe Flash崩溃; 将地址与readelf -s程序上的输出进行比较,您可能能够猜出segfault发生的功能有多远,这在阅读源代码时可能会有所帮助.(通过地址猜测你进入一个函数有多远,这是一个很长的镜头,但我发现知道我是否应该看看函数的开头或结尾是否有用.)

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

valgrind nodejs script.js
Run Code Online (Sandbox Code Playgroud)

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

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

gdb --args nodejs script.js
Run Code Online (Sandbox Code Playgroud)

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

幸运的话,你将指向失败的确切函数,ltrace(1)并将给你该函数的参数.这有望足以追踪具体的错误.