manateelazycat / lsp-bridge

A blazingly fast LSP client for Emacs
GNU General Public License v3.0
1.42k stars 205 forks source link

使用remote server一段时间不使用之后 再使用时所有lsp操作都没有响应 #831

Closed norris-young closed 8 months ago

norris-young commented 8 months ago

lsp-bridge remote相关的配置

(setq lsp-bridge-remote-start-automatically t)
(setq lsp-bridge-enable-with-tramp t)

我是通过tramp直接打开文件,没有使用lsp-bridge-open-remote-file。 在公司使用,公司内的PC连接公司内部的服务器(ssh连接,有rsa密钥,无需输入密码),连续使用时没有问题,但是如果一段时间不使用时再用就会有问题。 比如如果去开了个会,回来之后就会再使用时,所有的lsp命令就都没有响应了,这时候重启一次emacs可以继续正常使用。 因为是在公司使用,所以我现在不太方便提供log。

我自己尝试分析了一下: 开启了log之后,问题复现的时候没有报错,*lsp-bridge* buffer没有看到报错,此时从服务器上的lbr_log.txt里看,却没有受到任何本地发过去的消息。同时尝试debug了一下lsp-bridge-find-def函数,里面调用lsp-bridge-remote-send-lsp-request似乎也没有什么异常,但是就是发完之后没有任何回信,服务器也没有收到消息。服务器连接应该没有问题,这时候tramp还是可以正常打开远端文件,magit什么的也可以正常使用。看了本地和服务器的lsp_bridge.py也都在,没有被kill,并且好像此时lsp-bridge-open-remote-file还可以工作。

local场景下,好像也会遇到类似的问题,但之前没有开log看过,我都是通过lsp-bridge-restart-process来解决。现在remote场景下,远端的server不会被重启,本地lsp restart之后还是无法正常使用。

所以我想问下除了lsp-bridge-enable-log之外还有进一步的debug手段吗?现在有点不知道该怎么进一步定位问题,猫大能指导一下给点分析思路吗?

norris-young commented 8 months ago

刚刚又看到一个debug选项lsp-bridge-epc-debug,这个是不是不包含在lsp-bridge-enable-log里?我应该可以用这个进一步定位下。

manateelazycat commented 8 months ago

你更新到最新版了吗,最近国外开发者提交了远程服务器重连的机制

norris-young commented 8 months ago

你更新到最新版了吗,最近国外开发者提交了远程服务器重连的机制

好的 我试试看

norris-young commented 8 months ago

@manateelazycat 还是有一些问题存在, 提了一个PR,我再持续使用,有些问题不常复现,还需要debug看看 https://github.com/manateelazycat/lsp-bridge/pull/835

norris-young commented 8 months ago

@manateelazycat 问题最终找到了,在一段时间(我这里大约是2h12min,不知道是不是和服务器的sshd配置有关)client没有发送消息给server之后,server端的socket就会收到EOF,然后接收消息的loop就退出了。 https://github.com/manateelazycat/lsp-bridge/blob/378f5614408e49c0c3d5e85e20708fa50b1a0e62/lsp_bridge.py#L599 但此时client端依然可以正常发送,即便server端加上socket.close()也没有影响。 所以我加了一个心跳机制来解决这个问题 #862