Exception.StackTrace如何从我的源代码中知道行

本文关键字:源代码 我的 StackTrace Exception | 更新日期: 2024-08-02 00:35:06

这让我很困惑。

我的理解是,当我编译应用程序时,它会成为操作系统读取的优化代码。我的源代码中的东西,如变量名、行号等,不再有意义。

那么,我该如何构建和运行像这样的代码呢

try
{
    // ... 
}
catch ( Exception E )
{
    Console.WriteLine("Exception occured: {0}", E.StackTrace);
} 

并获得关于我的源代码中哪些部分可以对异常负责的所有详细信息。

现在,我明白了,在.NET中,我的C#代码最初并不是低级的"操作系统代码",而是Microsoft中介语言。我猜MIL为了生成这个异常信息,在我的源代码和编译的代码之间提供了某种类型的映射。这似乎是一个巨大的浪费,不是吗?因此,.NET中的"编译"并不是真正将源代码转换为机器代码;除了源代码外,它还在创建机器代码。这意味着我的Windows机器上的所有应用程序都有元数据作为源代码。

还是我完全错了?

Exception.StackTrace如何从我的源代码中知道行

编译程序集时,编译器还会生成一个.pdb文件,该文件本质上是一个数据库文件,用于在调试模式下运行程序集。它还包含优化代码和原始代码之间的映射,这允许调试器知道方法调用的行号。

有关.pdb文件的详细信息,请点击此处:https://msdn.microsoft.com/en-us/library/yd4f8bd1(vs.71).aspx

堆栈跟踪基本上包含几个部分的信息:

  1. 关于通向当前执行点的调用链的信息。您可以访问这些信息并不奇怪,因为当您从一个函数返回时,执行应该回到调用它的任何函数,以此类推,直到您的程序入口点。所有函数名称也都是免费提供的(记住,例如,您可以通过反射获得有关任何.NET方法的信息)。所以这部分不应该让你感到惊讶。

  2. 有关发生异常的源代码文件的信息,包括该文件的路径(在编译代码的机器上)和行号。这些信息存储在单独的(.pdb)文件中,是可选的。如果你不在目标机器上部署你的.pdb文件,你将不会在堆栈跟踪中看到这些信息。您可以为生产版本生成.pdb,也可以不生成,也可以将它们部署到目标机器。