59 lines
2.9 KiB
C#
59 lines
2.9 KiB
C#
|
|
// WL-816h — 콘솔 error/warning 수와 error 메시지만 뽑아 파일로 (토큰 절약)
|
|||
|
|
using System.Reflection;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
public static class WL816h_Console
|
|||
|
|
{
|
|||
|
|
public static void Dump()
|
|||
|
|
{
|
|||
|
|
var t = System.Type.GetType("UnityEditor.LogEntries,UnityEditor");
|
|||
|
|
var sb = new System.Text.StringBuilder();
|
|||
|
|
object[] args = { 0, 0, 0 };
|
|||
|
|
t.GetMethod("GetCountsByType", BindingFlags.Public | BindingFlags.Static).Invoke(null, args);
|
|||
|
|
sb.AppendLine("error=" + args[0] + " warning=" + args[1] + " log=" + args[2]);
|
|||
|
|
|
|||
|
|
int n = (int)t.GetMethod("StartGettingEntries", BindingFlags.Public | BindingFlags.Static).Invoke(null, null);
|
|||
|
|
var entryType = System.Type.GetType("UnityEditor.LogEntry,UnityEditor");
|
|||
|
|
var entry = System.Activator.CreateInstance(entryType);
|
|||
|
|
var getEntry = t.GetMethod("GetEntryInternal", BindingFlags.Public | BindingFlags.Static);
|
|||
|
|
var msgF = entryType.GetField("message", BindingFlags.Public | BindingFlags.Instance);
|
|||
|
|
var modeF = entryType.GetField("mode", BindingFlags.Public | BindingFlags.Instance);
|
|||
|
|
var seen = new System.Collections.Generic.Dictionary<string, int>();
|
|||
|
|
for (int i = 0; i < n; i++)
|
|||
|
|
{
|
|||
|
|
object[] a2 = { i, entry };
|
|||
|
|
getEntry.Invoke(null, a2);
|
|||
|
|
int mode = (int)modeF.GetValue(a2[1]);
|
|||
|
|
// Error(1) | Assert(2) | Fatal(0x10) | ScriptingError(0x100) | ScriptingException(0x400) | ScriptCompileError(0x800)
|
|||
|
|
bool isErr = (mode & (1 | 2 | 0x10 | 0x100 | 0x400 | 0x800 | 0x2000)) != 0;
|
|||
|
|
if (!isErr) continue;
|
|||
|
|
string m = (string)msgF.GetValue(a2[1]);
|
|||
|
|
if (m == null) continue;
|
|||
|
|
// 메시지 1줄 + 스택 앞 3줄 (누가 냈는지 보려고)
|
|||
|
|
var lines = m.Split('\n');
|
|||
|
|
var key = new System.Text.StringBuilder(lines[0].Length > 140 ? lines[0].Substring(0, 140) : lines[0]);
|
|||
|
|
for (int k = 1; k < lines.Length && k <= 3; k++)
|
|||
|
|
{
|
|||
|
|
var s = lines[k].Trim();
|
|||
|
|
if (s.Length == 0) continue;
|
|||
|
|
if (s.Length > 120) s = s.Substring(0, 120);
|
|||
|
|
key.Append("\n ").Append(s);
|
|||
|
|
}
|
|||
|
|
string kk = key.ToString();
|
|||
|
|
seen[kk] = seen.ContainsKey(kk) ? seen[kk] + 1 : 1;
|
|||
|
|
}
|
|||
|
|
t.GetMethod("EndGettingEntries", BindingFlags.Public | BindingFlags.Static).Invoke(null, null);
|
|||
|
|
sb.AppendLine("--- error 메시지(중복 묶음) ---");
|
|||
|
|
foreach (var kv in seen) sb.AppendLine(" ×" + kv.Value + " " + kv.Key);
|
|||
|
|
if (seen.Count == 0) sb.AppendLine(" (없음)");
|
|||
|
|
System.IO.File.WriteAllText("AgentScripts/WL816h_CONSOLE.txt", sb.ToString());
|
|||
|
|
Debug.Log("[816h console]\n" + sb);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
public static void Clear()
|
|||
|
|
{
|
|||
|
|
var t = System.Type.GetType("UnityEditor.LogEntries,UnityEditor");
|
|||
|
|
t.GetMethod("Clear", BindingFlags.Public | BindingFlags.Static).Invoke(null, null);
|
|||
|
|
}
|
|||
|
|
}
|