-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
2.0.0 发布出现崩溃弹窗的复盘 #1
Comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
问题
发布 2.0.0 之后,用户反馈打开编辑器并在3分钟内关闭它,偶现错误弹窗,如图:
定位问题:
先看 Dashboard 打开编辑器的逻辑,分别有2个地方会导致该窗口弹出
因为非必现,只能加了 console ,打包 asar,拿到容易复现的 window 电脑去操作,得到如下 log ,而且明确是 error 事件发出来的,不是 编辑器主动发的。
通过
ERR_IPC_CHANNEL_CLOSED
,这个错误信息进行百度,得知是 往子进程 send 一个消息,但是子进程不存在了。查看 node 文档 https://nodejs.org/docs/latest-v14.x/api/child_process.html#child_process_event_error 明确标出导致进程报错的原因包含:
刚好和错误信息里面的 ChildProcess.target.send 对应上了。
于是将问题定位在 @editor/user 包,拿到该包的源码发现:
只要业务上调用了一次 isLoggedIn ,都会触发 info-update 进而向所有子进程进行 send 操作,而且哪怕是渲染进程调用了 isLoggedIn 也是转发到主进程执行
原因
@editor/user 内部维护了一份 childrens,通过 addChildProcess 和 removeChildProcess 来更新队列,所以只要被 add 的子进程关闭后,没有被及时 remove,是会导致在 send 的时候报错的。
页面上的一些状态或者数据依赖了登陆状态,那么只要页面触发更新都是会请求一次 isLoggedIn , 比如 2.0.0 中加入的 persona 模块,在请求列表的时候 都会预先请求一次登录状态。
![企业微信截图_7f990605-ea67-43a0-a8e9-87166548cc7a](https://private-user-images.githubusercontent.com/35713518/261213931-e08e5a3c-131c-48fd-89ec-f7a3416f42dd.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjA2NDY4OTgsIm5iZiI6MTcyMDY0NjU5OCwicGF0aCI6Ii8zNTcxMzUxOC8yNjEyMTM5MzEtZTA4ZTVhM2MtMTMxYy00OGZkLTg5ZWMtZjdhMzQxNmY0MmRkLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MTAlMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzEwVDIxMjMxOFomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTgxMjkzNDA2ZDRkNWVjNDQ1NjQ2MjcwY2U2MGQ5NmRjNWEyNmIzMjVjODgxMmY4MWRiODA1N2M0ODlkNjBhZDEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.fA-Xy-2qxPfB6DHQEcQpXPeh0tNo80briCC1HWATL8k)
如果这次的调用时间刚好命中如下时序:
关闭creator
>调用isLoggedIn
>removeChildProcess
那么就会在 @editor/user 里面的 child.send 里报错,主要还是这边没有进行安全检查。
由于 2.0.0 增加了对 isLoggedIn 的调用,导致出现这种情况的概率增大了。
方案
@editor/user 应该进行防御性编程改为如下:
优化
dashboard 已经监听了 editor-error ipc, 进程的意外错误其实不应该直接弹窗给用户,后续可以改成生成日志文件等形式。
The text was updated successfully, but these errors were encountered: