View Issue Details

IDProjectCategoryView StatusLast Update
0004912NoesisGUIUnitypublic2026-04-27 12:16
ReporterYolkin Games Assigned Tojsantos  
PrioritynormalSeverityminor 
Status assignedResolutionopen 
Product Version3.2.12 
Target Version3.2.14 
Summary0004912: NoesisLangServer infinite error loop when native library is missing (Linux/CI runner on gitlab)
Description

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

PlatformLinux

Activities

Yolkin Games

Yolkin Games

2026-03-20 09:57

reporter   ~0012071

Last edited: 2026-03-20 10:29

Another one:

Summary
NoesisEditor.cs 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 and fills the GitLab CI 64MB log buffer.

Root Cause
In NoesisUnity.cs, the Init() method sets _initialized = true (line 45) before calling InitCore() (line 53):

_initialized = true;    // ← set BEFORE native calls

SetLicense();
RegisterLog();
InitCore();             // ← calls DisableSocketInit() → throws DllNotFoundException
InitCore() calls Noesis.GUI.DisableSocketInit(), which throws DllNotFoundException when the native library is missing. The exception propagates, but _initialized is already true.

In NoesisEditor.cs, the static constructor registers an EditorApplication.update callback:

EditorApplication.update += () =>
{
    if (NoesisUnity.Initialized)     // ← true, because _initialized was set before the crash
    {
        Noesis.GUI.UpdateInspector(); // ← also throws DllNotFoundException every tick
    }
};

Since NoesisUnity.Initialized returns true (despite init having failed), UpdateInspector() is called every editor update tick, throwing DllNotFoundException indefinitely.

Note: This is the same class of bug that was previously fixed in NoesisLangServer.cs, where a DllNotFoundException catch was added to disable the update callback after the first failure.

Impact
CI pipelines running Unity on Linux are severely impacted
64MB log buffer fills, suppressing all subsequent output including test/build results
Editor may appear to hang (consuming CPU on exception handling)

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 from NoesisEditor.cs:13 on every tick

Suggested Fix
Wrap the update callback to catch DllNotFoundException and disable itself, matching the pattern already used in NoesisLangServer.cs:

private static bool _isDisabled = false;

static NoesisEditor()
{
    EditorApplication.update += () =>
    {
        if (!_isDisabled && NoesisUnity.Initialized)
        {
            try
            {
                Noesis.GUI.UpdateInspector();
            }
            catch (DllNotFoundException)
            {
                _isDisabled = true;
            }
        }
    };
    // ... rest unchanged
}

Alternatively, the root cause in NoesisUnity.Init() could be fixed by moving _initialized = true to after InitCore() succeeds, or wrapping InitCore() in a try/catch that resets _initialized = false on failure.

Yolkin Games

Yolkin Games

2026-03-20 10:41

reporter   ~0012076

I see this was already assigned - sorry it might be that all I have to do is include Linux noesis libraries into my CI. This might be the cleanest fix of all.

jsantos

jsantos

2026-03-20 10:52

manager   ~0012077

Yes, adding the libraries is probably the right solution. But anyway I will fix these problems you are reporting, we should be more robust in these scenarios.

Yolkin Games

Yolkin Games

2026-03-20 11:03

reporter   ~0012078

are there linux libs for 4.0? cant find them. or ones from 3.2 will suffice?

jsantos

jsantos

2026-03-23 12:30

manager   ~0012085

For now, we only have binaries for windows for noesis 4.0

Issue History

Date Modified Username Field Change
2026-03-19 16:58 Yolkin Games New Issue
2026-03-20 09:57 Yolkin Games Note Added: 0012071
2026-03-20 10:24 sfernandez Assigned To => jsantos
2026-03-20 10:24 sfernandez Status new => assigned
2026-03-20 10:24 sfernandez Product Version => 3.2.12
2026-03-20 10:24 sfernandez Target Version => 3.2.13
2026-03-20 10:24 sfernandez Description Updated
2026-03-20 10:25 sfernandez Description Updated
2026-03-20 10:27 sfernandez Description Updated
2026-03-20 10:28 sfernandez Description Updated
2026-03-20 10:29 sfernandez Note Edited: 0012071
2026-03-20 10:29 sfernandez Note Edited: 0012071
2026-03-20 10:41 Yolkin Games Note Added: 0012076
2026-03-20 10:52 jsantos Note Added: 0012077
2026-03-20 11:03 Yolkin Games Note Added: 0012078
2026-03-23 12:30 jsantos Note Added: 0012085
2026-04-27 12:16 jsantos Target Version 3.2.13 => 3.2.14