javascript进程在setImmediate call中挂起

问题描述 投票:0回答:0

我有一个应用程序使用 setImmediate 来产生昂贵的同步操作。它有时会在 setImmediate 调用中挂起,因此控制台日志(“等待结束”)不会出现。

async function computeHeavyOp() {
     const largeVal = 10000;
     for (let i = 0; i < largeVal; i++) { 
        if ( i % 50 === 0) {
           await new Promise((resolve) => setImmediate(resolve));
           console.log(" await is over");
        }
     }
}

以上是应用程序的简化版本,它为事件等注册了许多回调。我无法获得可以模拟挂起的最小版本。

我们如何调试挂起的 JS 进程。我将 lldb 附加到 pid,如下所示,看起来 JS 线程只是不断循环,但似乎没有解决 setImmediate promise。请建议如何调试。可能在微任务队列中添加了一些回调,并且永远没有机会解决宏任务 setImmeidate。有没有办法指向可能是罪魁祸首的 JS 调用堆栈。是否有技术打印待处理的微任务队列并知道从我的应用程序启动的 JS 回调

* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGSTOP
  * frame #0: 0x00007ff8162b934e libsystem_kernel.dylib`kevent + 10
    frame #1: 0x00000001036e8361 libuv.1.dylib`uv__io_poll + 871
    frame #2: 0x00000001036d8dca libuv.1.dylib`uv_run + 359
    frame #3: 0x0000000101268ef0 node`node::SpinEventLoop(node::Environment*) + 301
    frame #4: 0x0000000101379f87 node`node::NodeMainInstance::Run(int*, node::Environment*) + 97
    frame #5: 0x0000000101379bb2 node`node::NodeMainInstance::Run(node::EnvSerializeInfo const*) + 130

当我在发出 setImmediate 之前使用 wtfnode 打印打开的句柄时,我只是得到了为连接到数据库而打开的套接字句柄。

- File descriptors: (note: stdio always exists)
  - fd 2 (tty) (stdio)
  - fd 1 (tty) (stdio)
  - fd 0 (tty)
- Sockets:
  - 127.0.0.1:51544 -> 127.0.0.1:2452
javascript freeze backtrace
© www.soinside.com 2019 - 2024. All rights reserved.