如何查看 .NET 应用程序的堆栈跟踪

3

我在生产中有一个.NET的Windows应用程序,无法访问Visual Studio(标准版),他们唯一能安装的是Express版本,它没有即时调试选项(当它崩溃时有调试按钮)。所以我想知道是否有Windows应用程序调试工具或其他工具,我可以运行或附加以查看堆栈跟踪。我还启用了PDB,但它并没有提供更多信息,因此我无法追踪我的崩溃(由未处理的异常引起)。

6个回答

6
如果你捕获异常,Exception对象就包含了堆栈跟踪信息:Exception.StackTrace。此外,你也可以通过Environment.StackTrace来访问它。
下面的代码中还有一个未处理异常的事件处理程序,它将把异常(包括堆栈跟踪信息)写入事件日志。
// Sample for the Environment.StackTrace property
using System;

class Sample
{
    public static void Main()
    {
        AppDomain.CurrentDomain.UnhandledException += 
          new UnhandledExceptionEventHandler(UnhandledExceptions);

        Console.WriteLine("StackTrace: '{0}'", Environment.StackTrace);
        throw new Exception("Fatal Error");
    }

    static void UnhandledExceptions(object sender, UnhandledExceptionEventArgs e)
    {
        string source = "SOTest";
        if (!System.Diagnostics.EventLog.SourceExists(source))
        {
            System.Diagnostics.EventLog.CreateEventSource(source, "Application");
        }

        System.Diagnostics.EventLog log = new System.Diagnostics.EventLog();
        log.Source = source;

        log.WriteEntry(e.ExceptionObject.ToString(), 
                       System.Diagnostics.EventLogEntryType.Error);
    }

那我可以打印出一些未处理的异常吗? - paradisonoir
是的。您可以使用日志记录框架将它们写入错误日志。 - Jon Limjap
@paradisonoir - 我添加了一个未处理异常事件处理程序,它将日志(包括堆栈跟踪)写入事件日志。 - Philip Wallace

3
你也可以使用windbg和sos.dll进行操作。

1
即使是中级开发人员,这可能也很困难。也许他们可以使用DebugDiag或其他工具生成崩溃转储,并使用WinDbg进行分析。然后简单的“analyze -v”就足以打印出异常信息。 - Lex Li
能否从Windbg中获取行号?因为我可以获取方法名,但无法获取行号。 - paradisonoir
只有当您拥有符号并且我认为它必须在调试模式下构建时才能这样做。 - Matt Wrock

1

它是否能为Stacktrace的内容提供良好的输出?例如类和行号,因为我的崩溃是未处理的。 - paradisonoir
@paradisonoir:顺便说一下,只有在您拥有程序集的pdb文件时才能使用行号。否则,您只会得到堆栈位置和方法名称。 - eduncan911
+1 提及一个免费的分析器,解决了 OP 的问题,即显示堆栈跟踪。为记录,这里是 CLR Profiler 2.0 的链接:http://tinyurl.com/ClrProfiler2 - galaktor

1

我认为你会发现,只有在你记录异常时,它们才会出现在这里! - Philip Wallace
我的应用程序出现异常,我没有处理它们,这里不显示。 - eduncan911
我的ASP.net应用程序还会自动将未处理的异常记录到事件日志中,无需编写代码。 - pyrocumulus
好的,我正在运行一个 Windows 应用程序,所以你认为它对他们有帮助吗?我的崩溃是由于未处理的异常。 - paradisonoir
糟糕,我错过了那部分(使用Windows应用程序)。我没有足够的经验知道Windows应用程序是否会出现在事件查看器中。我想它会。请快速查看一下。 - eduncan911
对于WinForms或WPF应用程序,事件日志条目是不同的,并且调用堆栈不可用。 - Lex Li

0

我用它启动了我的应用程序,但在崩溃后它没有任何堆栈跟踪的输出。 - paradisonoir

0

你也可以向你的应用程序添加全局异常处理程序。http://blogs.msdn.com/lexli/archive/2009/04/28/how-to-handle-net-unhandled-exceptions-gracefully.aspx - Lex Li

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接