Add debug logging facilities.

This commit is contained in:
Ottermandias 2025-01-22 17:36:01 +01:00
parent 737e74582b
commit 2afd6b966e
6 changed files with 50 additions and 4 deletions

@ -1 +1 @@
Subproject commit 055f169572223fd1b59389549c88b4c861c94608
Subproject commit 3c1260c9833303c2d33d12d6f77dc2b1afea3f34

@ -1 +1 @@
Subproject commit b9003b97da2d1191fa203a4d66956bc54c21db2a
Subproject commit 0bc2b0f66eee1a02c9575b2bb30f27ce166f8632

View file

@ -0,0 +1,6 @@
namespace Penumbra;
public class DebugConfiguration
{
public static bool WriteImcBytesToLog = false;
}

View file

@ -1,3 +1,4 @@
using OtterGui;
using Penumbra.GameData;
using Penumbra.GameData.Enums;
using Penumbra.GameData.Structs;
@ -194,11 +195,28 @@ public unsafe class ImcFile : MetaBaseFile
{
var (data, length) = resource->GetData();
var actualLength = ActualLength;
if (DebugConfiguration.WriteImcBytesToLog)
{
Penumbra.Log.Information($"Default IMC file -> Modified IMC File for {Path}:");
Penumbra.Log.Information(new Span<byte>((void*)data, length).WriteHexBytes());
Penumbra.Log.Information(new Span<byte>(Data, actualLength).WriteHexBytes());
Penumbra.Log.Information(new Span<byte>(Data, actualLength).WriteHexByteDiff(new Span<byte>((void*)data, length)));
}
if (length >= actualLength)
{
MemoryUtility.MemCpyUnchecked((byte*)data, Data, actualLength);
if (length > actualLength)
MemoryUtility.MemSet((byte*)(data + actualLength), 0, length - actualLength);
if (DebugConfiguration.WriteImcBytesToLog)
{
Penumbra.Log.Information(
$"Copied {actualLength} bytes from local IMC file into {length} available bytes.{(length > actualLength ? $" Filled remaining {length - actualLength} bytes with 0." : string.Empty)}");
Penumbra.Log.Information("Result IMC Resource Data:");
Penumbra.Log.Information(new Span<byte>((void*)data, length).WriteHexBytes());
}
return;
}
@ -209,11 +227,18 @@ public unsafe class ImcFile : MetaBaseFile
Penumbra.Log.Error($"Could not replace loaded IMC data at 0x{(ulong)resource:X}, allocation failed.");
return;
}
MemoryUtility.MemCpyUnchecked(newData, Data, actualLength);
if (paddedLength > actualLength)
MemoryUtility.MemSet(newData + actualLength, 0, paddedLength - actualLength);
if (DebugConfiguration.WriteImcBytesToLog)
{
Penumbra.Log.Information(
$"Allocated {paddedLength} bytes for IMC file, copied {actualLength} bytes from local IMC file. {(length > actualLength ? $" Filled remaining {length - actualLength} bytes with 0." : string.Empty)}");
Penumbra.Log.Information("Result IMC Resource Data:");
Penumbra.Log.Information(new Span<byte>(newData, paddedLength).WriteHexBytes());
}
Manager.XivFileAllocator.Release((void*)data, length);
resource->SetData((nint)newData, paddedLength);
}

View file

@ -0,0 +1,14 @@
using OtterGui.Text;
namespace Penumbra.UI.Tabs.Debug;
public static class DebugConfigurationDrawer
{
public static void Draw()
{
if (!ImUtf8.CollapsingHeaderId("Debug Logging Options"))
return;
ImUtf8.Checkbox("Log IMC File Replacements"u8, ref DebugConfiguration.WriteImcBytesToLog);
}
}

View file

@ -181,6 +181,7 @@ public class DebugTab : Window, ITab, IUiService
DrawDebugTabGeneral();
_crashHandlerPanel.Draw();
DebugConfigurationDrawer.Draw();
_diagnostics.DrawDiagnostics();
DrawPerformanceTab();
DrawPathResolverDebug();