chore: don't report crashes when shutting down the game, if no devplugin is loaded

This commit is contained in:
goat 2023-03-20 20:15:24 +01:00
parent 4f1257e79b
commit ec0f52b7c3
No known key found for this signature in database
GPG key ID: 49E2AA8C6A76498B
4 changed files with 41 additions and 1 deletions

View file

@ -244,6 +244,11 @@ internal sealed class DalamudConfiguration : IServiceType
/// </summary> /// </summary>
public int? PluginWaitBeforeFree { get; set; } public int? PluginWaitBeforeFree { get; set; }
/// <summary>
/// Gets or sets a value indicating whether or not crashes during shutdown should be reported.
/// </summary>
public bool ReportShutdownCrashes { get; set; }
/// <summary> /// <summary>
/// Gets or sets a list of saved styles. /// Gets or sets a list of saved styles.
/// </summary> /// </summary>

View file

@ -11,6 +11,7 @@ using Dalamud.Game.Gui.Internal;
using Dalamud.Interface.Internal; using Dalamud.Interface.Internal;
using Dalamud.Plugin.Internal; using Dalamud.Plugin.Internal;
using Dalamud.Utility; using Dalamud.Utility;
using PInvoke;
using Serilog; using Serilog;
#if DEBUG #if DEBUG
@ -103,6 +104,16 @@ internal sealed class Dalamud : IServiceType
public void Unload() public void Unload()
{ {
Log.Information("Trigger unload"); Log.Information("Trigger unload");
var reportCrashesSetting = Service<DalamudConfiguration>.GetNullable()?.ReportShutdownCrashes ?? true;
var pmHasDevPlugins = Service<PluginManager>.GetNullable()?.InstalledPlugins.Any(x => x.IsDev) ?? false;
if (!reportCrashesSetting && !pmHasDevPlugins)
{
// Leaking on purpose for now
var attribs = Kernel32.SECURITY_ATTRIBUTES.Create();
Kernel32.CreateMutex(attribs, false, "DALAMUD_CRASHES_NO_MORE");
}
this.unloadSignal.Set(); this.unloadSignal.Set();
} }

View file

@ -759,6 +759,12 @@ internal class DalamudInterface : IDisposable, IServiceType
} }
} }
if (ImGui.MenuItem("Report crashes at shutdown", null, configuration.ReportShutdownCrashes))
{
configuration.ReportShutdownCrashes = !configuration.ReportShutdownCrashes;
configuration.QueueSave();
}
ImGui.Separator(); ImGui.Separator();
if (ImGui.MenuItem("Open Dalamud branch switcher")) if (ImGui.MenuItem("Open Dalamud branch switcher"))

View file

@ -739,6 +739,11 @@ int main() {
std::cout << "Crash triggered" << std::endl; std::cout << "Crash triggered" << std::endl;
auto shutup_mutex = CreateMutex(NULL, false, L"DALAMUD_CRASHES_NO_MORE");
bool shutup = false;
if (shutup_mutex == NULL && GetLastError() == ERROR_ALREADY_EXISTS)
shutup = true;
/* /*
Hard won wisdom: changing symbol path with SymSetSearchPath() after modules Hard won wisdom: changing symbol path with SymSetSearchPath() after modules
have been loaded (invadeProcess=TRUE in SymInitialize() or SymRefreshModuleList()) have been loaded (invadeProcess=TRUE in SymInitialize() or SymRefreshModuleList())
@ -795,7 +800,11 @@ int main() {
std::wstring dumpError; std::wstring dumpError;
if (dumpPath.empty()) { if (dumpPath.empty()) {
std::cout << "Skipping dump path, as log directory has not been specified" << std::endl; std::cout << "Skipping dump path, as log directory has not been specified" << std::endl;
} else { } else if (shutup) {
std::cout << "Skipping dump, was shutdown" << std::endl;
}
else
{
MINIDUMP_EXCEPTION_INFORMATION mdmp_info{}; MINIDUMP_EXCEPTION_INFORMATION mdmp_info{};
mdmp_info.ThreadId = GetThreadId(exinfo.hThreadHandle); mdmp_info.ThreadId = GetThreadId(exinfo.hThreadHandle);
mdmp_info.ExceptionPointers = exinfo.pExceptionPointers; mdmp_info.ExceptionPointers = exinfo.pExceptionPointers;
@ -821,6 +830,10 @@ int main() {
std::wostringstream log; std::wostringstream log;
log << std::format(L"Unhandled native exception occurred at {}", to_address_string(exinfo.ContextRecord.Rip, false)) << std::endl; log << std::format(L"Unhandled native exception occurred at {}", to_address_string(exinfo.ContextRecord.Rip, false)) << std::endl;
log << std::format(L"Code: {:X}", exinfo.ExceptionRecord.ExceptionCode) << std::endl; log << std::format(L"Code: {:X}", exinfo.ExceptionRecord.ExceptionCode) << std::endl;
if (shutup)
log << L"======= Crash handler was globally muted(shutdown?) =======" << std::endl;
if (dumpPath.empty()) if (dumpPath.empty())
log << L"Dump skipped" << std::endl; log << L"Dump skipped" << std::endl;
else if (dumpError.empty()) else if (dumpError.empty())
@ -971,6 +984,11 @@ int main() {
submitThread = {}; submitThread = {};
} }
if (shutup) {
TerminateProcess(g_hProcess, exinfo.ExceptionRecord.ExceptionCode);
return 0;
}
int nButtonPressed = 0, nRadioButton = 0; int nButtonPressed = 0, nRadioButton = 0;
if (FAILED(TaskDialogIndirect(&config, &nButtonPressed, &nRadioButton, nullptr))) { if (FAILED(TaskDialogIndirect(&config, &nButtonPressed, &nRadioButton, nullptr))) {
ResumeThread(exinfo.hThreadHandle); ResumeThread(exinfo.hThreadHandle);