mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
chore: don't report crashes when shutting down the game, if no devplugin is loaded
This commit is contained in:
parent
4f1257e79b
commit
ec0f52b7c3
4 changed files with 41 additions and 1 deletions
|
|
@ -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>
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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"))
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue