-
- Yolkin Games
- Posts: 14
- Joined:
Bug: NoesisLangServer infinite error loop when native library is missing (Linux/CI runner on gitlab)
Unity version: 6000.3.7f1
Platform: Linux (Docker container, unityci/editor image — headless CI)
Summary
NoesisLangServer enters an infinite DllNotFoundException error loop on every editor update tick when the Noesis native library is not available (e.g. Linux CI runners where only the Windows .dll is shipped). This floods the Unity log at hundreds of lines per second, fills the GitLab CI 4MB log buffer within minutes, and keeps the editor effectively stuck for 30+ minutes.
Root Cause
In NoesisLangServer.cs, the static constructor registers an EditorApplication.update callback:
if (!_isInitialized)
{
_isInitialized = true; // ← set BEFORE the call that can throw
NoesisUnity.Init(); // ← throws DllNotFoundException on Linux
Init();
return;
}
Noesis_LangServer_RunTick(); // ← also throws DllNotFoundException every tick
_isInitialized is set to true before NoesisUnity.Init() is called.
NoesisUnity.Init() throws DllNotFoundException (native .so not present).
The exception propagates — Init() is never reached, so _isDisabled is never set.
On the next tick, _isInitialized is already true, so execution falls through to Noesis_LangServer_RunTick(), which also throws DllNotFoundException.
This repeats every editor update tick indefinitely.
The Init() method (line 40-57) does handle a similar scenario, but only catches EntryPointNotFoundException — not DllNotFoundException:
catch (EntryPointNotFoundException)
{
_isDisabled = true;
return;
}
Expected Behavior
When the native library is unavailable, NoesisLangServer should disable itself after the first failed attempt, similar to how Init() already handles EntryPointNotFoundException.
Suggested Fix
Wrap the update callback body to catch DllNotFoundException and set _isDisabled = true:
EditorApplication.update += () =>
{
if (!_isDisabled)
{
try
{
if (!_isInitialized)
{
_isInitialized = true;
NoesisUnity.Init();
Init();
return;
}
Noesis_LangServer_RunTick();
}
catch (DllNotFoundException)
{
_isDisabled = true;
}
}
};
Impact
CI pipelines running Unity on Linux (common with GameCI) are severely impacted
4MB log buffer fills in minutes, suppressing all subsequent output including test results
Editor may take 30+ minutes to complete what locally takes seconds
Reproduction Steps
Set up a Unity project with NoesisGUI on a Linux machine (or Docker container) where only the Windows native library is present
Run Unity in batch mode: unity-editor -batchmode -nographics -runTests -testPlatform EditMode -logFile -
Observe the log flooding with DllNotFoundException: Noesis on every tick
Platform: Linux (Docker container, unityci/editor image — headless CI)
Summary
NoesisLangServer enters an infinite DllNotFoundException error loop on every editor update tick when the Noesis native library is not available (e.g. Linux CI runners where only the Windows .dll is shipped). This floods the Unity log at hundreds of lines per second, fills the GitLab CI 4MB log buffer within minutes, and keeps the editor effectively stuck for 30+ minutes.
Root Cause
In NoesisLangServer.cs, the static constructor registers an EditorApplication.update callback:
if (!_isInitialized)
{
_isInitialized = true; // ← set BEFORE the call that can throw
NoesisUnity.Init(); // ← throws DllNotFoundException on Linux
Init();
return;
}
Noesis_LangServer_RunTick(); // ← also throws DllNotFoundException every tick
_isInitialized is set to true before NoesisUnity.Init() is called.
NoesisUnity.Init() throws DllNotFoundException (native .so not present).
The exception propagates — Init() is never reached, so _isDisabled is never set.
On the next tick, _isInitialized is already true, so execution falls through to Noesis_LangServer_RunTick(), which also throws DllNotFoundException.
This repeats every editor update tick indefinitely.
The Init() method (line 40-57) does handle a similar scenario, but only catches EntryPointNotFoundException — not DllNotFoundException:
catch (EntryPointNotFoundException)
{
_isDisabled = true;
return;
}
Expected Behavior
When the native library is unavailable, NoesisLangServer should disable itself after the first failed attempt, similar to how Init() already handles EntryPointNotFoundException.
Suggested Fix
Wrap the update callback body to catch DllNotFoundException and set _isDisabled = true:
EditorApplication.update += () =>
{
if (!_isDisabled)
{
try
{
if (!_isInitialized)
{
_isInitialized = true;
NoesisUnity.Init();
Init();
return;
}
Noesis_LangServer_RunTick();
}
catch (DllNotFoundException)
{
_isDisabled = true;
}
}
};
Impact
CI pipelines running Unity on Linux (common with GameCI) are severely impacted
4MB log buffer fills in minutes, suppressing all subsequent output including test results
Editor may take 30+ minutes to complete what locally takes seconds
Reproduction Steps
Set up a Unity project with NoesisGUI on a Linux machine (or Docker container) where only the Windows native library is present
Run Unity in batch mode: unity-editor -batchmode -nographics -runTests -testPlatform EditMode -logFile -
Observe the log flooding with DllNotFoundException: Noesis on every tick
Re: Bug: NoesisLangServer infinite error loop when native library is missing (Linux/CI runner on gitlab)
You’re totally right, this is a bug that needs to be fixed. Could you please report it in our tracker? We’ll provide a hotfix as soon as possible. Thank you!
-
- Yolkin Games
- Posts: 14
- Joined:
Re: Bug: NoesisLangServer infinite error loop when native library is missing (Linux/CI runner on gitlab)
Sure, apologies for using the wrong channel. Done now
https://www.noesisengine.com/bugs/view.php?id=4912
https://www.noesisengine.com/bugs/view.php?id=4912
Re: Bug: NoesisLangServer infinite error loop when native library is missing (Linux/CI runner on gitlab)
No worries, this is the right channel too. Thanks for the report!
Who is online
Users browsing this forum: FrancoisRecisio, Google [Bot] and 6 guests