gpt4 book ai didi

c# - 如何在 Windows 窗体应用程序中获取故障转储

转载 作者:行者123 更新时间:2023-12-01 22:17:56 24 4
gpt4 key购买 nike

注意:这不是 Is there a setting that is preventing the unhandled exception dialog from displaying in apps that I compile? 的重复项因为该帖子提出了相反的问题(如何获得我想要消除的对话框)和提供的答案,尽管它们提供了一些与我的问题相关的信息,但它没有回答我如何让我的应用程序创建的问题Windows 窗体事件引发未处理的异常时的故障转储。

我无法理解到底为什么有人希望用户看到这个对话框。

.NET error dialog

但这不是本文的重点。如何让我的应用程序生成故障转储?我想不通。

编辑:举例来说,我的可执行文件是 myapplication.exe。当它崩溃时,我希望 WERFAULT.EXE 来处理它,这样它就会创建一个故障转储,我的客户可以将其发送给我,以便我可以调查问题。如果我从一个线程中抛出一个未处理的异常,我会得到一个崩溃转储。但是,当我从 Windows 窗体事件中抛出未处理的异常时,会显示上面的对话框。

我创建了一个 myapplication.exe.config 文件,并按照此对话框详细信息底部的指示输入以下内容。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

除了我的 application.exe 文件之外,我还将 myapplication.exe.config 文件放在我的安装目录中。

现在应用程序就消失了。没有故障转储,即使我将注册表配置为创建故障转储。按照指示here

在我的安装程序中,我创建了必要的注册表更改以强制我的应用程序创建故障转储。在

HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps\myapplication.exe

注册表项我将 DumpType 设置为 2,将 DumpFolder 设置为我们的应用程序数据目录,将 DumpCount 设置为 1。但是进程就消失了,并且没有创建故障转储。

我知道机器已配置为正确创建故障转储,因为我可以向其他应用程序添加代码以使它们崩溃并正确创建故障转储。

编辑:如果我将主入口点 Application.SetUnhandledExceptionMode 添加到 UnhandledExceptionMode.ThrowException 我不会收到该对话框,但该过程就会消失。没有崩溃转储。

最佳答案

回答了我自己的问题。据我所知,没有任何配置可以使 Windows 窗体应用程序在 Windows 窗体事件引发未处理的异常时创建故障转储。但你可以在代码中触发它。

.NET 捕获在其表单事件中引发的异常并显示上面所示的 .NET 错误对话框。这可以通过 Application.SetUnhandledExceptionMode 来控制和 Application.ThreadException事件处理程序。

我的解决方案的前提是处理线程异常事件并在Windows窗体事件之外重新抛出异常。如果未捕获异常,如果机器配置为这样做,它将创建故障转储。

这样做的唯一缺点是堆栈跟踪不是初始异常发生时的堆栈跟踪,并且您无法从故障转储中引发的异常对象中获取它。所以你会想在某个地方记录堆栈跟踪。

    private class ApplicationThreadException : Exception
{
public new Exception InnerException { get; internal set; }
public ApplicationThreadException(Exception e)
{
InnerException = e;
}
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
throw new ApplicationThreadException(e.Exception);
}

[STAThread]
static void Main(string[] args)
{
Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
try
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new MyForm());
}
catch (ApplicationThreadException e)
{
throw e.InnerException;
}
catch (Exception e)
{
// do what ever
}
}

关于c# - 如何在 Windows 窗体应用程序中获取故障转储,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48325411/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com