Skip to content

src: add check against non-weak BaseObjects at process exit

When a process exits cleanly, i.e. because the event loop ends up without things to wait for, the Node.js objects that are left on the heap should be:

  1. weak, i.e. ready for garbage collection once no longer referenced, or
  2. detached, i.e. scheduled for destruction once no longer referenced, or
  3. an unrefed libuv handle, i.e. does not keep the event loop alive, or
  4. an inactive libuv handle (essentially the same here)

There are a few exceptions to this rule, but generally, if there are C++-backed Node.js objects on the heap that do not fall into the above categories, we may be looking at a potential memory leak. Most likely, the cause is a missing MakeWeak() call on the corresponding object.

In order to avoid this kind of problem, we check the list of BaseObjects for these criteria. In this commit, we only do so when explicitly instructed to or when in debug mode (where --verify-base-objects is always-on).

In particular, this avoids the kinds of memory leak issues that were fixed in the PRs referenced below (hence the blocked label).

Refs: https://github.com/nodejs/node/pull/35488 Refs: https://github.com/nodejs/node/pull/35487 Refs: https://github.com/nodejs/node/pull/35481

Checklist
  • make -j4 test (UNIX), or vcbuild test (Windows) passes
  • commit message follows commit guidelines

Merge request reports

Loading