anatawa12/ConsoleLogSaver

Linux (x86_64) 環境でUnity editorの自動検知に失敗する

Closed this issue · 1 comments

常体で失礼します


related: #20

11/11時点のHEADである01b8ebc83574aeb0f2e50100bee60a3092aae31dをチェックアウトし、手元でコンパイルして引数を与えずに動かそうと試みたが、実行時に次のようなエラーが出た。

Unhandled exception. System.Exception: No UnityEditors found
   at Program.<Main>$(String[] args) in /home/kisaragi/RiderProjects/ConsoleLogSaver/ConsoleLogSaver.Cli/Program.cs:line 53
   at Program.<Main>(String[] args)

検証のため、DebuggerSession.cs内のConnectAllUnityProcessesで下記コードを使用して現在動作しているプロセスの全列挙を試みた。

        foreach (var p in Process.GetProcesses())
        {
            Console.WriteLine($"{p.Id}: {p.ProcessName}");
        }

その結果、PID41026で動作しているUnityに対して次の結果が得られた。

41026: Main Thread

しかし、cut -d '' -f1 /proc/41026/cmdlineをした結果は次のようになり、C#の結果とは異なる。

/home/kisaragi/Unity/Hub/Editor/2019.4.31f1/Editor/Unity

提案するワークアラウンド

Linuxにはprocfs (FHS 3.0 / kernel.org)という実行中のプロセスを得るための擬似的なファイルシステムが/procとしてマウントされている。
それを呼び出すと次のようなコードになる。

        Process.GetProcesses().Where(p => File.ReadAllText($"/proc/{p.Id}/cmdline").Split('\0')[0].EndsWith("Unity"))
            .Select(x => x.Id).ToArray();

ここで、Split('\0')はC言語のmainで与えられるargvの各項目を切り離すために必要であり、[0]は実行ファイルのフルパスを得ている。

検討した解決策

.NET 7にアップグレードする

ConsoleLogSaver.Cli.csprojを次のように編集した:

diff --git a/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj b/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj
index 156e58a..733169f 100644
--- a/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj
+++ b/ConsoleLogSaver.Cli/ConsoleLogSaver.Cli.csproj
@@ -6,7 +6,7 @@
 
   <PropertyGroup>
     <OutputType>Exe</OutputType>
-    <TargetFramework>net6.0</TargetFramework>
+    <TargetFramework>net7.0</TargetFramework>
     <ImplicitUsings>enable</ImplicitUsings>
     <Nullable>enable</Nullable>
     <PublishSingleFile>true</PublishSingleFile>

しかし、この変更のみで再コンパイルしても症状が解消することはなかった。

dotnet/runtimeにissue投げても良さそうではありますね。一応Workaround入れときます。