Electron调用dll的event事件回调报错栈溢出

我是通过node-ffi-napi这个插件来调用dll函数的。
每当我运行electron程序后,只要触发了dll库里面的event事件,控制台就会输出'321',但是过几秒钟就报错栈溢出然后程序被杀掉。
类似于下面这样

PS F:\Project\myproject> npm run start

> my-project@1.0.0 start
> electron .

321
321
321

Process is terminated due to StackOverflowException.

PS F:\Project\myproject> 

我尝试debug输出错误
输出结果显示这样

Error: command failed
    at ChildProcess.<anonymous> (D:\env\nvm\v16.17.1\node_modules\npm\node_modules\@npmcli\promise-spawn\lib\index.js:63:27)
    at ChildProcess.emit (node:events:513:28)
    at maybeClose (node:internal/child_process:1093:16)
    at Process.ChildProcess._handle.onexit (node:internal/child_process:302:5) {
  cmd: 'C:\\windows\\system32\\cmd.exe',
  args: [
    '/d',
    '/s',
    '/c',
    'C:\\Users\\ADMINI~1\\AppData\\Local\\Temp\\start-11a285f4.cmd'
  ],
  code: 2147943401,
  signal: null,
  stdout: null,
  stderr: null,
  event: 'start',
  script: 'electron .',
  pkgid: 'skin-hair@1.0.0',
  path: 'F:\\Project\\Pacray\\skin\\front'
}

根据你的描述,您的Electron程序在调用DLL库的event事件后,会在控制台输出“321”,但随后几秒钟后就报StackOverflowException错误并被杀掉。这通常是由事件处理函数递归调用导致的栈溢出。
可能的原因有:

  1. DLL库中的event事件回调函数直接或间接递归调用自己,导致栈溢出。
  2. Electron主进程与DLL库通信过程中存在递归,导致栈溢出。
  3. Electron渲染进程与主进程通信,然后主进程再与DLL库通信,在此过程中存在递归,导致栈溢出。

解决方法:

  1. 检查DLL库中event事件的回调函数,看是否直接或间接递归调用自己,如果存在则需要修复,避免递归调用。
  2. Electron的主进程在接收到DLL库事件通知并执行回调时,也需检查是否存在递归调用,如果存在同样需要修复。
  3. 如果Electron的渲染进程也与此过程相关,需要在渲染进程与主进程通信时,以及主进程与DLL库通信时,同样检查并避免任何递归调用。
  4. 可以使用深度较小的递归调用,或改用循环替代递归调用,防止栈溢出。也可以增加栈空间大小。
  5. 启用相关日志记录,在程序崩溃前可以输出调用栈信息。分析调用栈信息可以帮助找到递归调用位置。
  6. 使用调试器如Visual Studio附加到Electron进程,设置断点于DLL回调函数之前与之后, STEP OVER跟踪检查调用栈,寻找递归位置。
  7. 提供Electron与DLL库的完整代码,以供更详细分析与调试。

综上,栈溢出错误通常由递归调用导致,我的建议是:

  1. 分析Electron与DLL库的通信过程,检查并修复任何直接或间接的递归调用。
  2. 使用调试器跟踪程序运行、检查调用栈,定位递归调用位置。
  3. 启用日志记录,在崩溃前输出调用栈,分析日志找出问题所在。
  4. 如果问题复杂,需要提供完整代码以便进行深入分析与调试。