electron: Async/Await crash: assertion env->async_hooks_init_function().IsEmpty() failed

  • Electron version: Anything over 1.7.8, until the latest 1.8.2-beta.1
  • Node: 8.8.0
  • Operating system: high sierra

Going over 1.7.8 seems to break Electron for one of our projects. It’s hard to track down what’s going on but here’s the output:

❯ yarn run electron
yarn run v1.2.1
$ electron .dev/electron.js
/Users/drcmda/dev/stepdoctor/node_modules/electron/dist/Electron.app/Contents/MacOS/Electron[41928]: ../../vendor/node/src/async-wrap.cc:399:void node::SetupHooks(const FunctionCallbackInfo<v8::Value> &): Assertion `env->async_hooks_init_function().IsEmpty()' failed.
 1: node::Abort() [/Users/drcmda/dev/stepdoctor/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 2: node::Assert(char const* const (*) [4]) [/Users/drcmda/dev/stepdoctor/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 3: node::AsyncWrap::Initialize(v8::Local<v8::Object>, v8::Local<v8::Value>, v8::Local<v8::Context>) [/Users/drcmda/dev/stepdoctor/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 4: v8::internal::StrDup(char const*) [/Users/drcmda/dev/stepdoctor/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 5: v8::internal::compiler::BranchElimination::ControlPathConditions::operator==(v8::internal::compiler::BranchElimination::ControlPathConditions const&) const [/Users/drcmda/dev/stepdoctor/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 6: v8::internal::compiler::BranchElimination::ControlPathConditions::operator==(v8::internal::compiler::BranchElimination::ControlPathConditions const&) const [/Users/drcmda/dev/stepdoctor/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 7: 0x3eadf51843fd
 8: 0x3eadf527777c
 9: 0x3eadf523be1c
✨  Done in 0.40s.

It happens when we require a file that has async/await calls in it, but nothing’s yet executed. But the moment we go back to 1.7.8 it starts working again.

About this issue

  • Original URL
  • State: closed
  • Created 7 years ago
  • Reactions: 15
  • Comments: 29 (11 by maintainers)

Commits related to this issue

Most upvoted comments

Getting a very similar error here on Mac OS high sierra just from importing the unzip package into my project.

electron v1.8.2

unzip = require('unzip');


node_modules/electron/dist/Electron.app/Contents/MacOS/Electron[5397]: ../../vendor/node/src/async-wrap.cc:399:void node::SetupHooks(const FunctionCallbackInfo<v8::Value> &): Assertion `env->async_hooks_init_function().IsEmpty()' failed.
 1: node::Abort() [/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 2: node::Assert(char const* const (*) [4]) [/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 3: node::AsyncWrap::Initialize(v8::Local<v8::Object>, v8::Local<v8::Value>, v8::Local<v8::Context>) [/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 4: v8::internal::StrDup(char const*) /node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 5: v8::internal::compiler::BranchElimination::ControlPathConditions::operator==(v8::internal::compiler::BranchElimination::ControlPathConditions const&) const [/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 6: v8::internal::compiler::BranchElimination::ControlPathConditions::operator==(v8::internal::compiler::BranchElimination::ControlPathConditions const&) const [/Users/kickthedragon/Projects/launcher-patcher/node_modules/electron/dist/Electron.app/Contents/Frameworks/Electron Framework.framework/Versions/A/Libraries/libnode.dylib]
 7: 0xca6c5043fd

Ok folks - I’ve made some headway here. Using an empty Electron project, I’m able to reproduce this by requiring awv3-node/server as noted above. To find exactly what source is crashing Node, I:

  1. Launched the test Electron project, and attached lldb to the renderer process.
  2. Open the Chrome Devtools and navigate to module.js and add a console.log to Module._load logging the filename it’s about to load.
  3. Make the app call require('awv3-node/server'). The devtools logs a bunch of paths and then hits the assertion failure in the stack trace, but LLDB prevents it from exiting so I can read the console.logs.

The file crashing the app is /Users/bengotow/Work/F376/Projects/Podtastic/node_modules/natives/index.js. It looks like it’s doing some /hella/ sketchy stuff. In the package description, it basically says it’s can and will break your app when Node changes: https://www.npmjs.com/package/natives. Lovely.

Rather than figure out what in this (actually very small) package has broken, I think the goal should be to remove it and whatever dependencies are doing such sketch stuff in the first place. In the case of awv3-node, here’s the full require path to natives (reading down roughly):

ode_modules/awv3-node/server.js
node_modules/unzip/unzip.js
node_modules/unzip/lib/parse.js
node_modules/setimmediate/setImmediate.js
node_modules/readable-stream/transform.js
node_modules/readable-stream/lib/_stream_transform.js
node_modules/readable-stream/lib/_stream_duplex.js
node_modules/core-util-is/lib/util.js
node_modules/readable-stream/lib/_stream_readable.js
node_modules/readable-stream/node_modules/isarray/index.js
node_modules/readable-stream/lib/_stream_writable.js
node_modules/binary/index.js
node_modules/chainsaw/index.js
node_modules/traverse/index.js
node_modules/buffers/index.js
node_modules/binary/lib/vars.js
node_modules/pullstream/pullstream.js
node_modules/readable-stream/passthrough.js
node_modules/readable-stream/lib/_stream_passthrough.js
node_modules/over/overload.js
node_modules/slice-stream/slicestream.js
node_modules/match-stream/match.js
node_modules/unzip/lib/entry.js
node_modules/unzip/lib/extract.js
node_modules/unzip/node_modules/fstream/fstream.js
node_modules/unzip/node_modules/fstream/lib/abstract.js
node_modules/unzip/node_modules/fstream/lib/reader.js
node_modules/unzip/node_modules/graceful-fs/graceful-fs.js
node_modules/unzip/node_modules/graceful-fs/fs.js
node_modules/natives/index.js

Stepping through the execution of https://github.com/isaacs/natives/blob/master/index.js, (I just edited the source on disk and added a debugger line), it looks like it calls runInThisContext on sources within NodeJS itself. When it calls runInThisContext with nm.filename = async_hooks.js, it retrieves the function, but when it executes it on line 109, the assertion failure occurs and Node crashes.

I have the same symptoms.

1.7.8 - No problems. 1.7.9 - I have not tested it.

1.8.1 beta - same error 1.8.2 beta.1 - same error

E:\GitHub_B2LiNK\Development-Binary-Windows\Binary\Electron\electron.exe: c:\projects\electron\vendor\node\src\async-wrap.cc:399: Assertion `env->async_hooks_init_function().IsEmpty()’ failed.

require( “exceljs” ) -> error

It happens on Windows, Mac, and Linux.

I have this issue when trying to use https://www.npmjs.com/package/unzip library:

/home/pawel/workspace/advanced-rest-client/arc-electron/node_modules/electron/dist/electron[26122]: ../../vendor/node/src/async-wrap.cc:357:void node::SetupHooks(const FunctionCallbackInfo<v8::Value> &): Assertion `env->async_hooks_init_function().IsEmpty()' failed.
 1: node::Abort() [/home/pawel/workspace/advanced-rest-client/arc-electron/node_modules/electron/dist/libnode.so]
 2: 0x7f5a12249cf4 [/home/pawel/workspace/advanced-rest-client/arc-electron/node_modules/electron/dist/libnode.so]
 3: 0x7f5a12234025 [/home/pawel/workspace/advanced-rest-client/arc-electron/node_modules/electron/dist/libnode.so]
 4: 0x7f5a11b2ebba [/home/pawel/workspace/advanced-rest-client/arc-electron/node_modules/electron/dist/libnode.so]
 5: 0x7f5a11a22662 [/home/pawel/workspace/advanced-rest-client/arc-electron/node_modules/electron/dist/libnode.so]
 6: 0x7f5a11a21d74 [/home/pawel/workspace/advanced-rest-client/arc-electron/node_modules/electron/dist/libnode.so]
 7: 0x1ee39ad0463d

As a workaround (thanks to @Tyriar) we will probably ship with this code to prevent access to the natives module which seems to be the main driver of this crash:

(function () {
	const Module = require('module');
	const originalLoad = Module._load;

	Module._load = function (request) {
		if (request === 'natives') {
			throw new Error('bad');
		}

		return originalLoad.apply(this, arguments);
	};
})();

As a point of clarification, in our experience the root cause of this issue is something that was depending on the natives package.

This package is deprecated and contains warnings of its use. Right from the natives README:

Caveat Dear Beloved User,

I feel compelled to give you a word of warning if you are considering using this module.

This module lets you do some creative things with the JavaScript code in Node.js. There are some > things here that are basically a recipe for memory leaks, or at the very least, being broken with each new release of Node, since none of these API surfaces are “technically” “supported” by the > > team managing the Node.js project.

So. Doesn’t seem to be electron’s issue. Heck, this isn’t even a node issue. Packages depending on the natives module, which is now deprecated and one could even argue - not be used in the first place are the issue.

Note: gulp v3.9.1 has this issue. The solution for us was to upgrade to gulp 4.

We’re having the same issue with 1.8.2.

Linux, debian.

/home/user/projects/particl/partgui/node_modules/electron/dist/electron[1930]: ../../vendor/node/src/async-wrap.cc:399:void node::SetupHooks(const FunctionCallbackInfo<v8::Value> &): Assertion `env->async_hooks_init_function().IsEmpty()' failed.
 1: node::Abort() [/home/user/projects/particl/partgui/node_modules/electron/dist/libnode.so]
 2: 0x78c63c361e84 [/home/user/projects/particl/partgui/node_modules/electron/dist/libnode.so]
 3: 0x78c63c3519d5 [/home/user/projects/particl/partgui/node_modules/electron/dist/libnode.so]
 4: 0x78c63bea2550 [/home/user/projects/particl/partgui/node_modules/electron/dist/libnode.so]
 5: 0x78c63bd10d98 [/home/user/projects/particl/partgui/node_modules/electron/dist/libnode.so]
 6: 0x78c63bd1030e [/home/user/projects/particl/partgui/node_modules/electron/dist/libnode.so]
 7: 0x8a9ebf843fd

Any workarounds or useful leads discovered yet? Same issue here, with or without babel in the stack.