確認ありがとうございました。よく考えたら本家とここは繋がっているのですね、二重投稿してしまい、失礼しました。 なぜ setImmediate( ) をかませば改善するのか、の点に疑問を残しながらですが、ben さんのお陰であっという間に解決です!あとは自分でソースを読めばなんとかなりそうです。
2017年6月19日月曜日 20時09分56秒 UTC+9 Yosuke FURUKAWA: > > > ちょっとまだ不明点が多いのでなんともなのですが、いきなりPromiseをrejectした(例外を投げた)時のタイミングで、SIGSEGVが起きるという話ですね。 > 一旦 ben が見てくれているようなので、そのままフォローしていただいたほうが早そうですね。 > > *https://github.com/nodejs/node/issues/13782 > <https://github.com/nodejs/node/issues/13782>* > > > > 2017年6月19日月曜日 16時11分56秒 UTC+9 Yoshitaka Sakamoto: >> >> はじめまして、坂本と申します。 >> 開発しているアプリケーションで 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 に対して発生する、ということは現象的にわかっているのですが、 >> 発生するようになる条件がわからない状況です。 >> よろしくお願いします。 >> >> -- --- このメールは Google グループのグループ「Node.js 日本ユーザグループ」の登録者に送られています。 このグループから退会し、グループからのメールの配信を停止するには nodejs_jp+unsubscr...@googlegroups.com にメールを送信してください。 その他のオプションについては、https://groups.google.com/d/optout にアクセスしてください。