はじめまして、坂本と申します。
開発しているアプリケーションで Node が不可思議な動きをしたので、もしご教示いただけることがあればと思い、投稿しました。
環境:
AWS 上で構築したサーバーです。
(CPU) Intel(R) Xeon(R) CPU E5-2666 v3 @ 2.90GHz
(OS) Ubuntu 16.04.2 LTS
(Node) v6.11.0
現象:
以下のソース(1)で SIGSEGV エラーが発生し、プロセスが停止する。(2)、(3)、(4) では問題ない、(5) では SIGSEGV 発生。
実行オプションには
--max_old_space_size=1024 --expose-gc
がついており、process 自体は forever にて fork した child_process で動いています。
(*) catch 部分はすべて同じなので、 (2) 以降は省略しています。
この部分だけを単独実行しても再現はしない模様です。
(1)
var when = Promise.resolve();
when = when.then(function() {
return new Promise(function(rsl, rej) {
rej('THROW ERROR'); // => SIGSEGV
});
});
when['catch'](function(e){
console.log(e);
});
(2)
var when = Promise.resolve();
when = when.then(function() {
return new Promise(function(rsl, rej) {
rsl(); // => OK
});
});
(3)
var when = Promise.resolve();
when = when.then(function() {
return new Promise(function(rsl, rej) {
process.nextTick(rej); // => OK
});
});
(4)
var when = Promise.resolve();
when = when.then(function() {
return new Promise(function(rsl, rej) {
setImmediate(rej); // => OK
});
});
(5)
var when = Promise.resolve();
when = when.then(function() {
return new Promise(function(rsl, rej) {
throw 'THROW ERROR' // => SIGSEGV
});
});
同期的なエラーの throw に対して発生する、ということは現象的にわかっているのですが、
発生するようになる条件がわからない状況です。
よろしくお願いします。