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

算法服务崩溃,如果 lua_filter 脚本中没有 return #1502

Closed
3 tasks done
yfdyh000 opened this issue Feb 16, 2025 · 14 comments
Closed
3 tasks done

算法服务崩溃,如果 lua_filter 脚本中没有 return #1502

yfdyh000 opened this issue Feb 16, 2025 · 14 comments
Labels

Comments

@yfdyh000
Copy link

yfdyh000 commented Feb 16, 2025

上报前请检查

  • 我遇到的问题没有其他人在 issue 里提到过
  • 我的小狼毫版本于 rime/weasel 下载
  • 我在使用小狼毫的最新发布版本,或最新发布版本后的 CI 构建

操作系统信息

  • OS 详细版本: Win10 22H2 19045.5552
  • 小狼毫版本: 0.16.3 2dc4e19

描述遇到的问题
调试Lua时遇到算法服务始终崩溃,按什么按键都崩溃,输入法不可用。如果这是一个代码bug,建议做修复。

复现步骤

patch:
  engine/filters/+
    - lua_filter@*test_filter*test_filter

lua\test_filter.lua 文件只需如

function test_filter(input)
end

有或无其他内容不重要,只要没有例如return { filter = filter }
部署。尝试输入文字。系统卡顿几秒,Temp\rime.weasel中生成dmp,无ERROR日志文件。

预期行为
跳过异常脚本,记录错误日志。test_filter.lua 文件不存在时是正常记录错误日志。

用户文件
N/A

截图
N/A

其他补充说明
错误堆栈与Lua脚本因多线程冲突导致的崩溃相似。rime!rime::UserDictManager::UpgradeUserDict+0x86dbd:

不清楚问题是否归Lua组件。

@yfdyh000 yfdyh000 added the Bug label Feb 16, 2025
@fxliang
Copy link
Contributor

fxliang commented Feb 17, 2025

这个可以用rime_api_console再确认一下,或者如果不想自编译librime的和,就用我做的那个rimeac.lua试试

@yfdyh000
Copy link
Author

这个可以用rime_api_console再确认一下,或者如果不想自编译librime的和,就用我做的那个rimeac.lua试试

不清楚测什么、怎么用。rimeac.lua.exe test_filter.lua是直接退出,无报错无输出。

@fxliang
Copy link
Contributor

fxliang commented Feb 17, 2025

看看script.lua,里面是一个基本前端的流程,这个是将rime_api_console的流程bind到lua里,在里面设置好用户目录,共享目录之类的就可以的,用户目录一样和常规的前端一样放置就行

@yfdyh000
Copy link
Author

好像是 PANIC: unprotected error in call to Lua API (attempt to index a boolean value)

另外,rimeac.setup_rime的参数:
中文路径支持也许有问题,错误堆栈里中文被吞。有遇到云输入的simplehttp.dll找不到。
指定 AppData/Roaming/Rime 后,E20250217 10:06:33.054645 7276 level_db.cc:259] Error opening db 'rime_mint': IO error: C:\Users\用户名\AppData\Roaming\Rime\rime_mint.userdb/LOCK: һʹôļ޷ʡ

@fxliang
Copy link
Contributor

fxliang commented Feb 17, 2025

好像是 PANIC: unprotected error in call to Lua API (attempt to index a boolean value)

另外,rimeac.setup_rime的参数: 中文路径支持也许有问题,错误堆栈里中文被吞。有遇到云输入的simplehttp.dll找不到。 指定 AppData/Roaming/Rime 后,E20250217 10:06:33.054645 7276 level_db.cc:259] Error opening db 'rime_mint': IO error: C:\Users\用户名\AppData\Roaming\Rime\rime_mint.userdb/LOCK: һʹôļ޷ʡ

是吗?我试过rimeac.setup_rime("rimeac.lua", "./shared", "./中文目录", "./log")这样是可以正常工作的(当然我没有加自定义方案)

@yfdyh000
Copy link
Author

好像是 PANIC: unprotected error in call to Lua API (attempt to index a boolean value)
另外,rimeac.setup_rime的参数: 中文路径支持也许有问题,错误堆栈里中文被吞。有遇到云输入的simplehttp.dll找不到。 指定 AppData/Roaming/Rime 后,E20250217 10:06:33.054645 7276 level_db.cc:259] Error opening db 'rime_mint': IO error: C:\Users\用户名\AppData\Roaming\Rime\rime_mint.userdb/LOCK: һʹôļ޷ʡ

是吗?我试过rimeac.setup_rime("rimeac.lua", "./shared", "./中文目录", "./log")这样是可以正常工作的(当然我没有加自定义方案)

不确定具体情况,用它加载时好时坏总有点毛病,不确定是否弄对了。
lua_gears.cc:83] Lua Compoment of autoload error:( module: *cloud_pinyin*processor name_space: *cloud_pinyin*processor status: 2 ): .../½ļ/rimeac.lua.x64/userdata/rime\lua\baidu.lua:3: module 'simplehttp' not found:

@fxliang
Copy link
Contributor

fxliang commented Feb 17, 2025

好像是 PANIC: unprotected error in call to Lua API (attempt to index a boolean value)

那可能要给librime-lua提bug了

@fxliang
Copy link
Contributor

fxliang commented Feb 21, 2025

试了下processor 和filter,都可以正常工作未崩。filter的时候会无输出。你复现的崩,有dmp文件出来吗?按#1259 的方法来看看崩在哪里?新的nightly会将相关的pdb文件都提供了的@yfdyh000

@yfdyh000
Copy link
Author

最新nightly依旧崩。
In WeaselServer.exe.18136.dmp the assembly instruction at rime!abort+35 in C:\Program Files\Rime\weasel-0.16.3\rime.dll has caused an unknown exception (0xc0000409) on thread 7

Faulting Thread
    Arg 1	    Arg 2	    Arg 3	    Arg 4	  Source
rime!abort+35 [minkernel\crts\ucrt\src\appcrt\startup\abort.cpp @ 77 + 5]	    00001d0`a8c3da38	    00001d0`ae2cde78	    0000000`00000000	    0000000`0000000f	  minkernel\crts\ucrt\src\appcrt\startup\abort.cpp @ 77 + 5
rime!luaD_throw+a0	    00001d0`a8c3da38	    0000000`00000000	    00001d0`a8c3da98	    00001d0`a8c3da38	  
rime!luaG_errormsg+69	    0000000`00000000	    00001d0`a5200d80	    0000000`00000000	    00001d0`a8c3da38	  
rime!luaG_runerror+8c	    0007ffc`6d51b37d	    0007ffc`6d524150	    0007ffc`6d526ac0	    0007ffc`6d526758	  
rime!lua_setlocal+87	    0007ffc`6d526ac0	    00001d0`a8c3da38	    00001d0`a8c3da38	    00001d0`a8c3dd90	  
rime!luaG_typeerror+2e	    00001d0`ae1eeb10	    00001d0`a8c3da38	    0000000`00000001	    00001d0`ae2ce2e0	  
rime!luaV_finishget+11e	    00001d0`a8c3da48	    00001d0`af4f0920	    00001d0`ae1eeb10	    00001d0`a8c3da38	  
rime!rapidjson::GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> >::~GenericValue<rapidjson::UTF8<char>,rapidjson::MemoryPoolAllocator<rapidjson::CrtAllocator> >+f2	    0000000`00000001	    0000039`44cfe790	    0000000`00000002	    0007ffc`6d3337c0	  
rime!rime::sub_module_init+92 [D:\a\librime\librime\plugins\lua\src\lua_gears.cc @ 46]	    0000000`00000021	    0000039`44cfe980	    0000000`00000000	    0000000`00000000	  D:\a\librime\librime\plugins\lua\src\lua_gears.cc @ 46
rime!rime::raw_init+611 [D:\a\librime\librime\plugins\lua\src\lua_gears.cc @ 94 + f]	    00001d0`a8d56eb0	    00001d0`af4f0d00	    0000000`00000000	    0000000`00000000	  D:\a\librime\librime\plugins\lua\src\lua_gears.cc @ 94 + f
rime!std::_Func_impl_no_alloc<<lambda_a1318673f481b3a17b7a55346e3b3ba5>,void,lua_State *>::_Do_call+34 [C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.42.34433\include\functional @ 878]	    0000000`00000000	    0000000`0000000a	    00001d0`a8c344b0	    00001d0`a8d56e80	  C:\Program Files\Microsoft Visual Studio\2022\Enterprise\VC\Tools\MSVC\14.42.34433\include\functional @ 878
rime!Lua::to_state+29 [D:\a\librime\librime\plugins\lua\src\lib\lua.cc @ 244 + 1c]	    00001d0`a8c3da38	    0000039`44cfeae0	    0000039`44cfeb60	    0007ffc`6d4f3104	  D:\a\librime\librime\plugins\lua\src\lib\lua.cc @ 244 + 1c
rime!rime::LuaFilter::LuaFilter+b6 [D:\a\librime\librime\plugins\lua\src\lua_gears.cc @ 144 + 37]	    00001d0`a8d56e80	    00001d0`a8c5c930	    00001d0`a8c5c930	    0000000`ffffffff	  D:\a\librime\librime\plugins\lua\src\lua_gears.cc @ 144 + 37
rime!rime::LuaComponent<rime::LuaFilter>::Create+58 [D:\a\librime\librime\plugins\lua\src\lua_gears.h @ 118 + 25]	    00001d0`a8d9c540	    00001d0`a8d9c540	    0000000`ffffffff	    00001d0`a8d56800	  D:\a\librime\librime\plugins\lua\src\lua_gears.h @ 118 + 25
rime!rime::ConcreteEngine::InitializeComponents+d04 [D:\a\librime\librime\src\rime\engine.cc @ 371 + 10]	    0000039`44cfedc0	    0000000`00000000	    00001d0`a53404a0	    00001d0`a5375710	  D:\a\librime\librime\src\rime\engine.cc @ 371 + 10
rime!rime::ConcreteEngine::ConcreteEngine+82a [D:\a\librime\librime\src\rime\engine.cc @ 92]	    0000002`00000088	    00001d0`a8d9b500	    00001d0`a53404a0	    0000039`02000002	  D:\a\librime\librime\src\rime\engine.cc @ 92
rime!rime::Engine::Create+20 [D:\a\librime\librime\src\rime\engine.cc @ 61 + 1c]	    00001d0`a5375710	    0000000`00000478	    0000000`00000001	    00001d0`a52e0000	  D:\a\librime\librime\src\rime\engine.cc @ 61 + 1c
rime!rime::Session::Session+59 [D:\a\librime\librime\src\rime\service.cc @ 18 + 5]	    0000039`44cff340	    00001d0`a8d9b500	    00001d0`a53404a0	    0007ffc`ed914365	  D:\a\librime\librime\src\rime\service.cc @ 18 + 5
rime!rime::Service::CreateSession+89 [D:\a\librime\librime\src\rime\service.cc @ 90 + 38]	    0000000`00000000	    00001d0`a5359620	    0000039`44cff4b0	    0007ffc`f214e693	  D:\a\librime\librime\src\rime\service.cc @ 90 + 38
WeaselServer!RimeWithWeaselHandler::AddSession+7f [D:\a\weasel\weasel\RimeWithWeasel\RimeWithWeasel.cpp @ 215 + a]	    0000000`00000000	    00001d0`a52ef700	    00001d0`a8d533e0	    0000000`0000026d	  D:\a\weasel\weasel\RimeWithWeasel\RimeWithWeasel.cpp @ 215 + a
WeaselServer!weasel::ServerImpl::HandlePipeMessage<std::function<void __cdecl(unsigned long)> >+c1 [D:\a\weasel\weasel\WeaselIPCServer\WeaselServerImpl.cpp @ 383 + 31]	    0000000`00000000	    0000000`00000000	    0000039`44cff6a0	    0000000`2c082004	  D:\a\weasel\weasel\WeaselIPCServer\WeaselServerImpl.cpp @ 383 + 31
WeaselServer!std::_Func_impl_no_alloc<<lambda_91192b005c7aa73687d1a97e5fb60d3e>,void,weasel::PipeMessage,std::function<void __cdecl(unsigned long)> >::_Do_call+f3 [C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\functional @ 822 + dc]	    0000000`00000000	    0000039`44cff580	    0000000`00008002	    0007ff7`3c7b7f60	  C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30133\include\functional @ 822 + dc
WeaselServer!weasel::PipeServer::_ProcessPipeThread+113 [D:\a\weasel\weasel\WeaselIPCServer\WeaselServerImpl.cpp @ 433 + 67]	    00001d0`a538f980	    0000000`00000000	    00001d0`a538f980	    0000000`00000000	  D:\a\weasel\weasel\WeaselIPCServer\WeaselServerImpl.cpp @ 433 + 67
WeaselServer!boost::thread::start_thread_noexcept+ca	    00001d0`a8d74b30	    0000000`00000000	    0000000`00000000	    0000000`00000000	  
WeaselServer!thread_start<unsigned int (__cdecl*)(void *),1>+5a [minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 97 + 17]	    0000000`00000000	    0000000`00000000	    0000000`00000000	    0000000`00000000	  minkernel\crts\ucrt\src\appcrt\startup\thread.cpp @ 97 + 17
kernel32!BaseThreadInitThunk+14	    0000000`00000000	    0000000`00000000	    0000000`00000000	    0000000`00000000	  
ntdll!RtlUserThreadStart+21

WeaselServer.exe.11784.dmp

@wzv5
Copy link
Contributor

wzv5 commented Feb 23, 2025

看了下 lua 插件的源码,确实没有检查脚本是不是有 return,无脑按有 return 来处理,于是就内存越界读写了。
这样倒也没什么问题,文档已经说了要有 return,你不按文档要求写脚本。
当然真要计较的话,确实是 lua 插件没有做好检查,应该去 lua 插件那边提。

@yfdyh000
Copy link
Author

好的,谢谢您的检查。

@yfdyh000 yfdyh000 closed this as not planned Won't fix, can't repro, duplicate, stale Feb 23, 2025
@shewer
Copy link

shewer commented Feb 23, 2025

看了下 lua 插件的源码,确实没有检查脚本是不是有 return,无脑按有 return 来处理,于是就内存越界读写了。 这样倒也没什么问题,文档已经说了要有 return,你不按文档要求写脚本。 当然真要计较的话,确实是 lua 插件没有做好检查,应该去 lua 插件那边提。

Only lua_processor func (key, env) should return 0, 1, 2 (reject , accept, noop)

@wzv5
Copy link
Contributor

wzv5 commented Feb 23, 2025

Only lua_processor func (key, env) should return 0, 1, 2 (reject , accept, noop)

你看错了,不是处理函数的返回值,是整个脚本文件的返回值。

@shewer
Copy link

shewer commented Feb 23, 2025

lua_filter@module[@namespace] --手動載入 在 rime.lua 中載入 module = require 'xxxx.lua' , env.name_space = module
lua_filter@*module[@namespace] -- 自動載入 module.lua

-- module.lua for filter
local F = {}

return F

lua_filter@modulesubmodule[@namespace] -- 自動載入 module.lua submodule

-- module.lua
local F = {}  -- lua_filter 
function F.init(env) end
function F.fini(env) end
function F.func(tran, env) end
local T = {} -- lua_translator
return { tran=T, submodule=F}

請查看 wiki

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

No branches or pull requests

4 participants