mirror of
https://github.com/goatcorp/Dalamud.git
synced 2025-12-12 18:27:23 +01:00
feat: show throwing plugin in unhandled managed exceptions
This commit is contained in:
parent
063a9408e1
commit
1096a49dd6
2 changed files with 32 additions and 4 deletions
|
|
@ -8,6 +8,7 @@ using System.Threading.Tasks;
|
|||
|
||||
using Dalamud.Configuration.Internal;
|
||||
using Dalamud.Logging.Internal;
|
||||
using Dalamud.Plugin.Internal;
|
||||
using Dalamud.Support;
|
||||
using Dalamud.Utility;
|
||||
using Newtonsoft.Json;
|
||||
|
|
@ -325,10 +326,29 @@ public sealed class EntryPoint
|
|||
info = $"{ex.TargetSite.DeclaringType.Assembly.GetName().Name}, {ex.TargetSite.DeclaringType.FullName}::{ex.TargetSite.Name}";
|
||||
}
|
||||
|
||||
var pluginInfo = string.Empty;
|
||||
var supportText = ", please visit us on Discord for more help.";
|
||||
try
|
||||
{
|
||||
var pm = Service<PluginManager>.GetNullable();
|
||||
var plugin = pm?.FindCallingPlugin(new StackTrace(ex));
|
||||
if (plugin != null)
|
||||
{
|
||||
pluginInfo = $"Plugin that caused this:\n{plugin.Name}\n\nClick \"Yes\" and remove it.\n\n";
|
||||
|
||||
if (plugin.Manifest.IsThirdParty)
|
||||
supportText = string.Empty;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// ignored
|
||||
}
|
||||
|
||||
const MessageBoxType flags = NativeFunctions.MessageBoxType.YesNo | NativeFunctions.MessageBoxType.IconError | NativeFunctions.MessageBoxType.SystemModal;
|
||||
var result = MessageBoxW(
|
||||
Process.GetCurrentProcess().MainWindowHandle,
|
||||
$"An internal error in a Dalamud plugin occurred.\nThe game must close.\n\nType: {ex.GetType().Name}\n{info}\n\nMore information has been recorded separately, please contact us in our Discord or on GitHub.\n\nDo you want to disable all plugins the next time you start the game?",
|
||||
$"An internal error in a Dalamud plugin occurred.\nThe game must close.\n\n{ex.GetType().Name}\n{info}\n\n{pluginInfo}More information has been recorded separately{supportText}.\n\nDo you want to disable all plugins the next time you start the game?",
|
||||
"Dalamud",
|
||||
flags);
|
||||
|
||||
|
|
|
|||
|
|
@ -1300,14 +1300,14 @@ Thanks and have fun!";
|
|||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the plugin that called this method by walking the stack,
|
||||
/// Get the plugin that called this method by walking the provided stack trace,
|
||||
/// or null, if it cannot be determined.
|
||||
/// At the time, this is naive and shouldn't be used for security-critical checks.
|
||||
/// </summary>
|
||||
/// <param name="trace">The trace to walk.</param>
|
||||
/// <returns>The calling plugin, or null.</returns>
|
||||
public LocalPlugin? FindCallingPlugin()
|
||||
public LocalPlugin? FindCallingPlugin(StackTrace trace)
|
||||
{
|
||||
var trace = new StackTrace();
|
||||
foreach (var frame in trace.GetFrames())
|
||||
{
|
||||
var declaringType = frame.GetMethod()?.DeclaringType;
|
||||
|
|
@ -1328,6 +1328,14 @@ Thanks and have fun!";
|
|||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get the plugin that called this method by walking the stack,
|
||||
/// or null, if it cannot be determined.
|
||||
/// At the time, this is naive and shouldn't be used for security-critical checks.
|
||||
/// </summary>
|
||||
/// <returns>The calling plugin, or null.</returns>
|
||||
public LocalPlugin? FindCallingPlugin() => this.FindCallingPlugin(new StackTrace());
|
||||
|
||||
private void DetectAvailablePluginUpdates()
|
||||
{
|
||||
var updatablePlugins = new List<AvailablePluginUpdate>();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue