c# - 附加 .net 调试器,同时仍然提供有用的死亡日志记录

标签 c# debugging stack-trace

我希望在我的代码根部有某种捕获所有异常的机制,这样当应用程序意外终止时我仍然可以提供一些有用的日志记录。

类似的东西

static void Main () {
    if (Debugger.IsAttached)
        RunApp();
    else {
        try {
            RunApp();
        }
        catch (Exception e) {
            LogException(e);
            throw;
        }
    }
 }

虽然一切正常,但我的问题是当我想在引发异常后附加调试器时。

由于异常逃逸到运行时,windows 将提示附加 visual studio,除了,因为它已被重新抛出,所以堆栈上的所有局部变量和参数都已丢失。

有没有办法记录这些异常,同时仍然提供一种方法来附加调试器并保留所有有用的信息?

最佳答案

正如 Paul Betts 已经提到的,您最好使用 AppDomain.UnhandledException事件而不是 try/catch block 。

在您的 UnhandledException 事件处理程序中,您可以记录/显示异常,然后提供调试选项,例如显示一个表单,其中包含异常详细信息和要忽略、调试或退出的按钮。

如果用户选择调试选项,调用System.Diagnostics.Debugger.Break()这允许用户在完整调用堆栈仍然可用的情况下附加他们想要的任何调试器。

显然,您可以为您知道永远不会将调试器附加到的任何构建禁用此选项。

class Program
{
    static void Main()
    {
        AppDomain.CurrentDomain.UnhandledException += ExceptionHandler;

        RunApp();
    }

    static void ExceptionHandler(object sender, UnhandledExceptionEventArgs e)
    {
        Console.WriteLine(e.ExceptionObject);
        Console.WriteLine("Do you want to Debug?");
        if (Console.ReadLine().StartsWith("y"))
            Debugger.Break();
    }

    static void RunApp()
    {
        throw new Exception();
    }
}

关于c# - 附加 .net 调试器,同时仍然提供有用的死亡日志记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/211622/

相关文章:

c# - 需要开源简单的3D软件渲染器

c# - C# Web 应用程序的项目属性页面上不提供“调试”选项卡

c# - 目录不存在 - 参数名称 : directoryVirtualPath

user-interface - Julia 构建错误没有意义

c# - 从资源中读取文件并将其写入 C# 中的磁盘

c# - 使用 Apache 服务器的 ClickOnce 更新

c# - asp :TextBox? 上的动态 ID

c# - 当前在 C# 中跟踪程序流的可能性?

debugging - 当 D 中抛出异常时,如何使调试器中断?

python - 为什么 Python 中的 traceback.extract_stack() 这么慢?