Skip to content
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

[bug] CI 版本,雾凇拼音,若算法服务被拉起,进入部署状态,则当前应用卡死,且算法服务崩溃 #1279

Closed
mirtlebot opened this issue Jun 1, 2024 · 15 comments · Fixed by #1281

Comments

@mirtlebot
Copy link

  • 版本:Weasel Nightly Buid 2024.06.01 8246b8c
  • 环境:VMware Windows 10 23H2 AtlasOS 未安装小狼毫
  • 配置:雾凇拼音(无更改)

复现步骤:

  1. 安装 Weasel,安装雾凇拼音,部署,确认一切 OK
  2. 对中文词典做一些更改,例如将大字库重新添加等,因为中文词典特别大,部署时间长,效果明显。
  3. 手动退出算法服务
  4. 打字
  5. 卡死,日志文件夹中出现 debug 文件
2024.06.01.16.22.webm

(视频中截了一段,是因为第一次实验,整个系统卡死了,我乱点后,直接被强退了,上面的 error log 显示未编译完成)

Originally posted by @mirtlebot in #1269 (comment)

猜想:

若此 bug 证实,我猜想之前一些用户未能正常开机自启动的原因是,

  • 开机启动
  • 小狼毫是默认输入法
  • 随便按了些按键
  • WeaselServer 拉起,进入了部署状态,然后 Server 就退;

之所以会进入部署状态,我猜想可能是有一些人喜欢用第三方软件往词库里面加词(lua 也可以做到),这些东西都需要重新部署

个人猜测和 lua 写的好不好关联不大,毕竟上述实验,一个字都没打上,如果真的是分析和 lua 相关,那只能说在乱打的时候, lua 做了什么事情,或者在卡死后,lua 没做什么事情

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

用最新的master的状态,雾凇拼音
步骤:
1,部署,正常可打字
2,修改字典注释掉一个字
3,部署
4,退出服务
5,记事本中打字

未复现问题😅

image
try

@mirtlebot
Copy link
Author

嗯,试试开启一个大字表呢,那个 44418 字表,那个应该要部署一段时间

我试了三次,都有卡死现象才提的

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

一样没有复现问题, Windows 10 LTSC 测试的,版本号10.0.19044 暂缺 Build 19044

部署多长时间影响不大,我试过有空明码部署(完整一次要接近1分钟),删除全部部署好的空明码的文件然后部署,打字也没有卡死

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

最新的代码中,从Client发出的消息,如果超时2秒会强制返回0,按理说不会有可能卡死。

LRESULT ClientImpl::_SendMessage(WEASEL_IPC_COMMAND Msg,
DWORD wParam,
DWORD lParam) {
try {
PipeMessage req{Msg, wParam, lParam};
auto future = std::async(std::launch::async,
[this, &req]() { return channel.Transact(req); });
// wait Transact complete or overtime
if (future.wait_for(std::chrono::seconds(2)) ==
std::future_status::timeout) {
// Transact overtime
return 0;
} else {
// Transact complete
return future.get();
}
} catch (DWORD /* ex */) {
return 0;
}
}

在处理按键过程中,如果返回0就意味着这个按键事件 rime不处理,直接会跳过相关输入法相关的处理直接将按键交给应用处理,就是直接上屏的状态

void WeaselTSF::_ProcessKeyEvent(WPARAM wParam, LPARAM lParam, BOOL* pfEaten) {
if (!_IsKeyboardOpen() || _IsKeyboardDisabled()) {
*pfEaten = FALSE;
return;
}
// if server connection is Not OK, don't eat it.
if (!_EnsureServerConnected()) {
*pfEaten = FALSE;
return;
}

如果是Echo中,超时返回0会让Client识别连接无效,也是跳过输入处理的

bool WeaselTSF::_EnsureServerConnected() {
if (!m_client.Echo()) {
_Reconnect();
retry++;
if (retry >= 6) {
HANDLE hMutex = CreateMutex(NULL, TRUE, L"WeaselDeployerExclusiveMutex");
if (!m_client.Echo() && GetLastError() != ERROR_ALREADY_EXISTS) {
std::wstring dir = _GetRootDir();
std::thread th([dir, this]() {
ShellExecuteW(NULL, L"open", (dir + L"\\start_service.bat").c_str(),
NULL, dir.c_str(), SW_HIDE);
// wait 500ms, then reconnect
std::this_thread::sleep_for(std::chrono::milliseconds(500));
_Reconnect();
});
th.detach();
}
if (hMutex) {
CloseHandle(hMutex);
}
retry = 0;
}
return (m_client.Echo() != 0);
} else {
return true;
}
}

@mirtlebot
Copy link
Author

mirtlebot commented Jun 1, 2024

可能是我少描述了什么,我这里 Windows 11 lot LTSC 和 Windows 23H2(AAtlas OS)照样能复现:

1717234460.webm

Edit:就这样吧,改天再试,或者看看其他人怎么说。

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

这个dmp文件可以上传上来,毕竟已经知道你是哪个版本的小狼毫了

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

我倒是试出一个退出服务的时候,librime里的一些对象析构时的问题,目前不稳定复现

image

@mirtlebot
Copy link
Author

mirtlebot commented Jun 1, 2024

WeaselServer.exe.4772.dmp.zip

这个是重新跑的。Windows 10 虚拟机

我不懂具体实现,但允许我 Off-topic 一下,Weasel 可能在处理 lua 时和其他前端有些不一样。这个 librime-lua 的 bug,其他所有前端都会报错,rime_api_console 也会报错,但唯独 Weasel 不报错,按理说应当是无法同步,用户词典锁定的。

hchunhui/librime-lua#335

Update:

我用实机跑了下(非雾凇配置,但用了雾凇的词库,以及其中的两个 unicode 和 number 两个lua),报了这个错误,实机用的是自己构建的 librime,所以不放 dmp 了

image

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

自行构建rime.dll 应该会有rime.pdb, 将这个和weaselserver.pdb 都放exe同目录,在那个分析软件加上那个路径,分析下就有东西出来了至于 c0000005参考
https://learn.microsoft.com/zh-cn/shows/inside/c0000005

@mirtlebot
Copy link
Author

不懂,没看到过 rime.pdb,和用 clang 编译的有关系吗?

那个软件也没搞明白,移动 pdb 到程序目录,并添加 symbol 路径后,点分析,提示什么无法生成 xxx,返回了 31 之类。

等你发新版后,其他人有没有复现好了。🤣

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

哦,clang 编译是没有的,msvc 的产物

@fxliang
Copy link
Contributor

fxliang commented Jun 1, 2024

复现了问题,但是这个未有思路

@fxliang
Copy link
Contributor

fxliang commented Jun 2, 2024

有一个办法是注释掉

if (RimeStartMaintenance(/*full_check = */ False)) {
m_disabled = true;
}

不在算法服务里面部署,只能用WeaselDeployer.exe来部署更新

更新,我推自用分支了,目前试了似乎还行

@mirtlebot
Copy link
Author

昨天搞懂那个 pdb 分析软件的用法(虚拟机无支持的浏览器,无法打开报告才报错)

里面提示是什么内存访问出错,跟这个一模一样

#1269 (comment)

大概他说的现象,也是这个原因:#1259 (comment)

我原先努力复现,是以为能找到了一些人说的什么 lua 导致崩溃、和开机不能自启的稳定复现方法,看起来不太像。🤣

@changzaicl
Copy link

试了一下,现在好多了。用了一天多下来,没有出现假死的情况了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging a pull request may close this issue.

3 participants