mirror of
https://github.com/xivdev/Penumbra.git
synced 2025-12-12 10:17:22 +01:00
Fix some stuff, add versions.
This commit is contained in:
parent
c1a9c798ae
commit
7cb50030f9
6 changed files with 45 additions and 20 deletions
|
|
@ -24,6 +24,12 @@ public class CrashData
|
||||||
/// <summary> The time this crash data was generated. </summary>
|
/// <summary> The time this crash data was generated. </summary>
|
||||||
public DateTimeOffset CrashTime { get; set; } = DateTimeOffset.UnixEpoch;
|
public DateTimeOffset CrashTime { get; set; } = DateTimeOffset.UnixEpoch;
|
||||||
|
|
||||||
|
/// <summary> Penumbra's Version when this crash data was created. </summary>
|
||||||
|
public string Version { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
/// <summary> The Game's Version when this crash data was created. </summary>
|
||||||
|
public string GameVersion { get; set; } = string.Empty;
|
||||||
|
|
||||||
/// <summary> The FFXIV process ID when this data was generated. </summary>
|
/// <summary> The FFXIV process ID when this data was generated. </summary>
|
||||||
public int ProcessId { get; set; } = 0;
|
public int ProcessId { get; set; } = 0;
|
||||||
|
|
||||||
|
|
@ -52,11 +58,11 @@ public class CrashData
|
||||||
=> LastVfxFuncsInvoked.Count == 0 ? default : LastVfxFuncsInvoked[0];
|
=> LastVfxFuncsInvoked.Count == 0 ? default : LastVfxFuncsInvoked[0];
|
||||||
|
|
||||||
/// <summary> A collection of the last few characters loaded before this crash data was generated. </summary>
|
/// <summary> A collection of the last few characters loaded before this crash data was generated. </summary>
|
||||||
public List<CharacterLoadedEntry> LastCharactersLoaded { get; } = [];
|
public List<CharacterLoadedEntry> LastCharactersLoaded { get; set; } = [];
|
||||||
|
|
||||||
/// <summary> A collection of the last few modded files loaded before this crash data was generated. </summary>
|
/// <summary> A collection of the last few modded files loaded before this crash data was generated. </summary>
|
||||||
public List<ModdedFileLoadedEntry> LastModdedFilesLoaded { get; } = [];
|
public List<ModdedFileLoadedEntry> LastModdedFilesLoaded { get; set; } = [];
|
||||||
|
|
||||||
/// <summary> A collection of the last few vfx functions invoked before this crash data was generated. </summary>
|
/// <summary> A collection of the last few vfx functions invoked before this crash data was generated. </summary>
|
||||||
public List<VfxFuncInvokedEntry> LastVfxFuncsInvoked { get; } = [];
|
public List<VfxFuncInvokedEntry> LastVfxFuncsInvoked { get; set; } = [];
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ public sealed class GameEventLogReader : IDisposable
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public JsonObject Dump(string mode, int processId, int exitCode)
|
public JsonObject Dump(string mode, int processId, int exitCode, string version, string gameVersion)
|
||||||
{
|
{
|
||||||
var crashTime = DateTimeOffset.UtcNow;
|
var crashTime = DateTimeOffset.UtcNow;
|
||||||
var obj = new JsonObject
|
var obj = new JsonObject
|
||||||
|
|
@ -34,6 +34,8 @@ public sealed class GameEventLogReader : IDisposable
|
||||||
[nameof(CrashData.CrashTime)] = DateTimeOffset.UtcNow,
|
[nameof(CrashData.CrashTime)] = DateTimeOffset.UtcNow,
|
||||||
[nameof(CrashData.ProcessId)] = processId,
|
[nameof(CrashData.ProcessId)] = processId,
|
||||||
[nameof(CrashData.ExitCode)] = exitCode,
|
[nameof(CrashData.ExitCode)] = exitCode,
|
||||||
|
[nameof(CrashData.Version)] = version,
|
||||||
|
[nameof(CrashData.GameVersion)] = gameVersion,
|
||||||
};
|
};
|
||||||
|
|
||||||
foreach (var (reader, singular, _) in Readers)
|
foreach (var (reader, singular, _) in Readers)
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ public class CrashHandler
|
||||||
{
|
{
|
||||||
public static void Main(string[] args)
|
public static void Main(string[] args)
|
||||||
{
|
{
|
||||||
if (args.Length < 2 || !int.TryParse(args[1], out var pid))
|
if (args.Length < 4 || !int.TryParse(args[1], out var pid))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
try
|
try
|
||||||
|
|
@ -17,7 +17,7 @@ public class CrashHandler
|
||||||
|
|
||||||
parent.WaitForExit();
|
parent.WaitForExit();
|
||||||
var exitCode = parent.ExitCode;
|
var exitCode = parent.ExitCode;
|
||||||
var obj = reader.Dump("Crash", pid, exitCode);
|
var obj = reader.Dump("Crash", pid, exitCode, args[2], args[3]);
|
||||||
using var fs = File.Open(args[0], FileMode.Create);
|
using var fs = File.Open(args[0], FileMode.Create);
|
||||||
using var w = new Utf8JsonWriter(fs, new JsonWriterOptions { Indented = true });
|
using var w = new Utf8JsonWriter(fs, new JsonWriterOptions { Indented = true });
|
||||||
obj.WriteTo(w, new JsonSerializerOptions() { WriteIndented = true });
|
obj.WriteTo(w, new JsonSerializerOptions() { WriteIndented = true });
|
||||||
|
|
|
||||||
|
|
@ -22,15 +22,17 @@ public sealed class CrashHandlerService : IDisposable, IService
|
||||||
private readonly ActorManager _actors;
|
private readonly ActorManager _actors;
|
||||||
private readonly ResourceLoader _resourceLoader;
|
private readonly ResourceLoader _resourceLoader;
|
||||||
private readonly Configuration _config;
|
private readonly Configuration _config;
|
||||||
|
private readonly ValidityChecker _validityChecker;
|
||||||
|
|
||||||
public CrashHandlerService(FilenameService files, CommunicatorService communicator, ActorManager actors, ResourceLoader resourceLoader,
|
public CrashHandlerService(FilenameService files, CommunicatorService communicator, ActorManager actors, ResourceLoader resourceLoader,
|
||||||
Configuration config)
|
Configuration config, ValidityChecker validityChecker)
|
||||||
{
|
{
|
||||||
_files = files;
|
_files = files;
|
||||||
_communicator = communicator;
|
_communicator = communicator;
|
||||||
_actors = actors;
|
_actors = actors;
|
||||||
_resourceLoader = resourceLoader;
|
_resourceLoader = resourceLoader;
|
||||||
_config = config;
|
_config = config;
|
||||||
|
_validityChecker = validityChecker;
|
||||||
|
|
||||||
if (!_config.UseCrashHandler)
|
if (!_config.UseCrashHandler)
|
||||||
return;
|
return;
|
||||||
|
|
@ -152,6 +154,8 @@ public sealed class CrashHandlerService : IDisposable, IService
|
||||||
};
|
};
|
||||||
info.ArgumentList.Add(_files.LogFileName);
|
info.ArgumentList.Add(_files.LogFileName);
|
||||||
info.ArgumentList.Add(Environment.ProcessId.ToString());
|
info.ArgumentList.Add(Environment.ProcessId.ToString());
|
||||||
|
info.ArgumentList.Add($"{_validityChecker.Version} ({_validityChecker.CommitHash})");
|
||||||
|
info.ArgumentList.Add(_validityChecker.GameVersion);
|
||||||
_child = Process.Start(info);
|
_child = Process.Start(info);
|
||||||
if (_child == null)
|
if (_child == null)
|
||||||
throw new Exception("Child Process could not be created.");
|
throw new Exception("Child Process could not be created.");
|
||||||
|
|
@ -177,7 +181,7 @@ public sealed class CrashHandlerService : IDisposable, IService
|
||||||
JsonObject jObj;
|
JsonObject jObj;
|
||||||
lock (_eventWriter)
|
lock (_eventWriter)
|
||||||
{
|
{
|
||||||
jObj = reader.Dump("Manual Dump", Environment.ProcessId, 0);
|
jObj = reader.Dump("Manual Dump", Environment.ProcessId, 0, $"{_validityChecker.Version} ({_validityChecker.CommitHash})", _validityChecker.GameVersion);
|
||||||
}
|
}
|
||||||
|
|
||||||
var logFile = _files.LogFileName;
|
var logFile = _files.LogFileName;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
using Dalamud.Interface.Internal.Notifications;
|
using Dalamud.Interface.Internal.Notifications;
|
||||||
using Dalamud.Plugin;
|
using Dalamud.Plugin;
|
||||||
|
using FFXIVClientStructs.FFXIV.Client.System.Framework;
|
||||||
using OtterGui.Classes;
|
using OtterGui.Classes;
|
||||||
using OtterGui.Services;
|
using OtterGui.Services;
|
||||||
|
|
||||||
|
|
@ -20,6 +21,7 @@ public class ValidityChecker : IService
|
||||||
|
|
||||||
public readonly string Version;
|
public readonly string Version;
|
||||||
public readonly string CommitHash;
|
public readonly string CommitHash;
|
||||||
|
public readonly string GameVersion;
|
||||||
|
|
||||||
public ValidityChecker(DalamudPluginInterface pi)
|
public ValidityChecker(DalamudPluginInterface pi)
|
||||||
{
|
{
|
||||||
|
|
@ -30,12 +32,17 @@ public class ValidityChecker : IService
|
||||||
var assembly = GetType().Assembly;
|
var assembly = GetType().Assembly;
|
||||||
Version = assembly.GetName().Version?.ToString() ?? string.Empty;
|
Version = assembly.GetName().Version?.ToString() ?? string.Empty;
|
||||||
CommitHash = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "Unknown";
|
CommitHash = assembly.GetCustomAttribute<AssemblyInformationalVersionAttribute>()?.InformationalVersion ?? "Unknown";
|
||||||
|
GameVersion = GetGameVersion();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static unsafe string GetGameVersion()
|
||||||
|
=> Framework.Instance()->GameVersion[0];
|
||||||
|
|
||||||
public void LogExceptions()
|
public void LogExceptions()
|
||||||
{
|
{
|
||||||
if (ImcExceptions.Count > 0)
|
if (ImcExceptions.Count > 0)
|
||||||
Penumbra.Messager.NotificationMessage($"{ImcExceptions} IMC Exceptions thrown during Penumbra load. Please repair your game files.", NotificationType.Warning);
|
Penumbra.Messager.NotificationMessage($"{ImcExceptions} IMC Exceptions thrown during Penumbra load. Please repair your game files.",
|
||||||
|
NotificationType.Warning);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Because remnants of penumbra in devPlugins cause issues, we check for them to warn users to remove them.
|
// Because remnants of penumbra in devPlugins cause issues, we check for them to warn users to remove them.
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,9 @@ public static class CrashDataExtensions
|
||||||
{
|
{
|
||||||
ImGui.TextUnformatted(nameof(data.Mode));
|
ImGui.TextUnformatted(nameof(data.Mode));
|
||||||
ImGui.TextUnformatted(nameof(data.CrashTime));
|
ImGui.TextUnformatted(nameof(data.CrashTime));
|
||||||
|
ImGui.TextUnformatted("Current Age");
|
||||||
|
ImGui.TextUnformatted(nameof(data.Version));
|
||||||
|
ImGui.TextUnformatted(nameof(data.GameVersion));
|
||||||
ImGui.TextUnformatted(nameof(data.ExitCode));
|
ImGui.TextUnformatted(nameof(data.ExitCode));
|
||||||
ImGui.TextUnformatted(nameof(data.ProcessId));
|
ImGui.TextUnformatted(nameof(data.ProcessId));
|
||||||
ImGui.TextUnformatted(nameof(data.TotalModdedFilesLoaded));
|
ImGui.TextUnformatted(nameof(data.TotalModdedFilesLoaded));
|
||||||
|
|
@ -25,6 +28,9 @@ public static class CrashDataExtensions
|
||||||
{
|
{
|
||||||
ImGui.TextUnformatted(data.Mode);
|
ImGui.TextUnformatted(data.Mode);
|
||||||
ImGui.TextUnformatted(data.CrashTime.ToString());
|
ImGui.TextUnformatted(data.CrashTime.ToString());
|
||||||
|
ImGui.TextUnformatted((DateTimeOffset.UtcNow - data.CrashTime).ToString(@"dd\.hh\:mm\:ss"));
|
||||||
|
ImGui.TextUnformatted(data.Version);
|
||||||
|
ImGui.TextUnformatted(data.GameVersion);
|
||||||
ImGui.TextUnformatted(data.ExitCode.ToString());
|
ImGui.TextUnformatted(data.ExitCode.ToString());
|
||||||
ImGui.TextUnformatted(data.ProcessId.ToString());
|
ImGui.TextUnformatted(data.ProcessId.ToString());
|
||||||
ImGui.TextUnformatted(data.TotalModdedFilesLoaded.ToString());
|
ImGui.TextUnformatted(data.TotalModdedFilesLoaded.ToString());
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue