Fix some stuff, add versions.

This commit is contained in:
Ottermandias 2024-03-16 16:58:02 +01:00
parent c1a9c798ae
commit 7cb50030f9
6 changed files with 45 additions and 20 deletions

View file

@ -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; } = [];
} }

View file

@ -25,15 +25,17 @@ 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
{ {
[nameof(CrashData.Mode)] = mode, [nameof(CrashData.Mode)] = mode,
[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)

View file

@ -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 });

View file

@ -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;

View file

@ -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)
{ {
@ -28,14 +30,19 @@ public class ValidityChecker : IService
IsValidSourceRepo = CheckSourceRepo(pi); IsValidSourceRepo = CheckSourceRepo(pi);
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.

View file

@ -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());