tested with (armv7 and x86_64) using a clone from git repository today 8/17/2015 npm built with nodejs 0.12.7 core dumps nodejs 0.12.7 starts ok npm built with nodejs 0.10.40 works fine nodejs 0.10.40 works fine
I have managed to reproduce this issue using qemu_x86_64_defconfig in the 2015.11 release. My initial tests seem to show it's related to using uclibc. To reproduce the npm crash do the following: 1) start with qemu_x86_64_defconfig 2) add the C++ compiler 3) enable node.js version 0.12.7 4) enable npm for the target 5) build and run in qemu as per the instructions in board/qemu/x86_64/readme.txt 6) login and type npm -v, it will crash. Changing the toolchain from uclibc to glibc causes npm to start working. So as a work around use glibc. I'll try and narrow down the issue further.
Created attachment 6236 [details] qemu_x86_64_npm_crash_defconfig qemu_x86_64_npm_crash_defconfig is modified from qemu_x86_64_defconfig. It has the C++ compiler added, node.js and npm for the target. Running npm on the target will crash. Set BR2_TOOLCHAIN_BUILDROOT_GLIBC=y to test using glibc where npm will work.
Thanks for the investigation. Can you rebuild with debugging symbols, and get a core dump, to see where we are crashing?
Created attachment 6241 [details] backtrace from npm core dump I have attached a back trace from the npm crash. I see node::os::GetInterfaceAddresses is called so as an experiment i tried the following javascript var os = require('os'); var ifaces = os.networkInterfaces(); console.log(ifaces); This produces the same back trace as running npm. Running this code using glibc works. So it seems the issues is npm is using os.networkInterfaces() which works with glibc but not uclibc. You can find the code for node::os::GetInterfaceAddresses in node.js v0.12.7 here https://github.com/nodejs/node/blob/d3492aa7b386946e3a156440cad346e5b0a82838/src/node_os.cc#L225-L300. The back trace shows the crash is in OneByteString which is called in several places in node::os::GetInterfaceAddresses. The data it's operating on comes from a call to uv_interface_addresses() which is part libuv that's in node.js. The code for uv_interface_addresses() is here https://github.com/nodejs/node/blob/d3492aa7b386946e3a156440cad346e5b0a82838/deps/uv/src/unix/linux-core.c#L786-L878. I suspect uv_interface_addresses() is where the issue lies.
(In reply to Martin from comment #4) > Created attachment 6241 [details] > backtrace from npm core dump > > I have attached a back trace from the npm crash. I see > node::os::GetInterfaceAddresses is called so as an experiment i tried the > following javascript > > var os = require('os'); > var ifaces = os.networkInterfaces(); > console.log(ifaces); > > This produces the same back trace as running npm. Running this code using > glibc works. So it seems the issues is npm is using os.networkInterfaces() > which works with glibc but not uclibc. > > You can find the code for node::os::GetInterfaceAddresses in node.js v0.12.7 > here > https://github.com/nodejs/node/blob/d3492aa7b386946e3a156440cad346e5b0a82838/ > src/node_os.cc#L225-L300. > > The back trace shows the crash is in OneByteString which is called in > several places in node::os::GetInterfaceAddresses. The data it's operating > on comes from a call to uv_interface_addresses() which is part libuv that's > in node.js. The code for uv_interface_addresses() is here > https://github.com/nodejs/node/blob/d3492aa7b386946e3a156440cad346e5b0a82838/ > deps/uv/src/unix/linux-core.c#L786-L878. > > I suspect uv_interface_addresses() is where the issue lies. Can you check if libuv's config.h has HAVE_IFADDRS_H ? If not, there is an obvious bug in node::os::GetInterfaceAddresses: it will loop using the uninitialized count variable when err == UV_ENOSYS. There's a missing return in that condition.
(In reply to Arnout Vandecappelle from comment #5) > (In reply to Martin from comment #4) > > Created attachment 6241 [details] > > backtrace from npm core dump > > > > I have attached a back trace from the npm crash. I see > > node::os::GetInterfaceAddresses is called so as an experiment i tried the > > following javascript > > > > var os = require('os'); > > var ifaces = os.networkInterfaces(); > > console.log(ifaces); > > > > This produces the same back trace as running npm. Running this code using > > glibc works. So it seems the issues is npm is using os.networkInterfaces() > > which works with glibc but not uclibc. > > > > You can find the code for node::os::GetInterfaceAddresses in node.js v0.12.7 > > here > > https://github.com/nodejs/node/blob/d3492aa7b386946e3a156440cad346e5b0a82838/ > > src/node_os.cc#L225-L300. > > > > The back trace shows the crash is in OneByteString which is called in > > several places in node::os::GetInterfaceAddresses. The data it's operating > > on comes from a call to uv_interface_addresses() which is part libuv that's > > in node.js. The code for uv_interface_addresses() is here > > https://github.com/nodejs/node/blob/d3492aa7b386946e3a156440cad346e5b0a82838/ > > deps/uv/src/unix/linux-core.c#L786-L878. > > > > I suspect uv_interface_addresses() is where the issue lies. > > Can you check if libuv's config.h has HAVE_IFADDRS_H ? If not, there is an > obvious bug in node::os::GetInterfaceAddresses: it will loop using the > uninitialized count variable when err == UV_ENOSYS. There's a missing return > in that condition. HAVE_IFADDRS_H is defined at the top of the linux-core.c file. I spotted this code yesterday but a second look today and I see the issue. The following snip is from #define HAVE_IFADDRS_H 1 #ifdef __UCLIBC__ # if __UCLIBC_MAJOR__ < 0 || __UCLIBC_MINOR__ < 9 || __UCLIBC_SUBLEVEL__ < 32 # undef HAVE_IFADDRS_H # endif #endif I think this is trying to say if uclibc version is < 0.9.32 but the logical or is wrong, it should be and. It means HAVE_IFADDRS_H is indeed undefined. If i change this to logical and then npm works. Also, this code is not in node.js 0.10.40 which is why it works. I'll work on a patch.
Preferably make two patches for upstream: one that fixes the SEGV in node::os::GetInterfaceAddresses by adding the missing return (that's a patch we don't really need in buildroot), and one patch that adds support for uClibc-ng.
I have submitted 2 patches upsteam: 1) https://github.com/nodejs/node/pull/4272 - Fixes the crash in node.js 2) https://github.com/libuv/libuv/pull/653 - Fixes the underlying issues of uClibc-ng support in libuv I have tested these patches for node.js 0.12.9, 4.2.3 and 5.2.0 and it fixes the issues. I'll submit patches to buildroot tonight.
Fixed by https://git.busybox.net/buildroot/commit/?id=5bba3ca130249a2557f250095ccfccb6aadb8576. Thanks Martin!