没有 pdb 文件的堆栈跟踪中更具体的异常位置

如何解决没有 pdb 文件的堆栈跟踪中更具体的异常位置

在应用程序中,应始终尽最大努力确保代码经过全面测试,并以正确处理格式错误的输入或操作的方式编写。

虽然我们只是人,错误会蔓延,为了改善用户体验而不是毫不客气地崩溃到桌面,通常会捕获未处理的异常,向用户抛出消息并记录一些错误信息.

通常,PDB 不会随完成的程序一起分发,因此系统跟踪将不包含行号,这会导致难以找到引发错误的违规行。

以下面的示例程序为例(为简单起见,一个 .net 控制台应用程序)

using System;

namespace ExceptionTest
{
    class Program
    {
        static void Main(string[] args)
        {
            // Just in case we forget to catch something properly.
            System.AppDomain.CurrentDomain.UnhandledException += UnhandledExceptionTrapper;

            Console.WriteLine(DoStuff(10));

            Console.ReadKey();
        }

        static int DoStuff(int parameter)
        {
            int[] data = { 1,2,3,4,5,6 };

            int value = data[parameter]; // Improperly checked code

            return value;
        }

        static void UnhandledExceptionTrapper(object sender,UnhandledExceptionEventArgs e)
        {
            Console.WriteLine(e.ExceptionObject.ToString());
            Console.WriteLine("Press Enter to continue");
            Console.ReadLine();
            Environment.Exit(1);
        }
    }
}

如果它在没有 .pdb 文件的情况下运行,它将尽职尽责地捕获错误并报告它。

system.indexOutOfRangeException: Index was outside the bounds of the array.
   at ExceptionTest.Program.DoStuff(Int32 parameter)
   at ExceptionTest.Program.Main(String[] args)
Press Enter to continue

有什么办法可以在用户代码中包含发生错误的点,或者这只是不存在于可执行文件中(显然,我们可以看到 DoStuff 函数名称,其中包含了一些符号信息。

例如,除了堆栈跟踪之外,还有什么方法可以记录 int value = data[parameter];

解决方法

您在没有 PDB 的调用堆栈中看到的内容是可用的,因为您的 C# 代码是作为中间语言 (IL) 提供的。

这样想:你可以通过反射做的一切(例如,请求类和请求类的方法)在 IL 代码中也可用,因此可以成为堆栈跟踪的一部分。

但是,IL 代码仍然在发布版本中进行了优化,例如可以删除未使用的变量。

有什么办法可以包含这个点

没有。该信息位于 PDB 中。我们的想法是,您甚至可以为发布版本构建 PDB,并且至少为您提供给客户的版本store them in a symbol server

我也不只是捕捉异常并向用户显示信息或将其保存在日志文件中。相反,您可以使用您为此目的而存储的 PDB 在您的 PC 上分析 create a crash dump 文件 (.DMP)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?