【问题标题】:How the CLR locates pdb symbol filesCLR 如何定位 pdb 符号文件
【发布时间】:2012-02-08 17:43:20
【问题描述】:

我想知道 CLR 如何定位 pdb 符号文件,以及是否可以覆盖此行为。

我在网上查找(MSDN 和其他资源)但找不到好的答案。

在我的应用程序中,我将 DLL 放置在主 .EXE 路径的几个子目录中。

我想要一个 Symbols\ 目录,其中包含我的应用程序的所有符号。 默认情况下,我相信符号是从程序集所在的位置拾取的。这个可以改吗?

【问题讨论】:

  • 发生托管异常时,会创建一个异常对象,并且当符号可用时,它包含带有文件信息的堆栈跟踪(源文件:行号)。我相信 CLR(或将堆栈跟踪添加到异常的任何人都会查询这些文件)。
  • 顺便说一句,CLR 可能会调用其他 (Win32) 代码,因此它本身可能对 PDB 文件一无所知。

标签: c# .net clr symbols


【解决方案1】:
【解决方案2】:

您可以简单地为您自己的进程设置 _NT_SYMBOL_PATH 环境变量。这很好用:

using System;
using System.Runtime.CompilerServices;
using System.Reflection;
using System.IO;

class Program {
    static void Main(string[] args) {
        var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
        path = Path.Combine(path, "symbols");
        Environment.SetEnvironmentVariable("_NT_SYMBOL_PATH", path);
        try {
            Kaboom();
        }
        catch (Exception ex) {
            Console.WriteLine(ex.ToString());
        }
        Console.ReadLine();
    }
    [MethodImpl(MethodImplOptions.NoInlining)]
    static void Kaboom() {
        throw new Exception("test");
    }
}

【讨论】:

  • 这似乎对我不起作用。它仅在调试时起作用还是在我将应用程序部署到其他地方时起作用?
  • 我在没有调试器并运行发布版本的情况下对此进行了测试。除了没有将 .pdbs 当然放在正确的子目录中之外,我没有看到一个好的失败模式。
  • 我正在运行 DEBUG 构建,不确定这是否重要。在我的应用程序初始化的早期设置环境变量。我已将所有符号放在正确的文件夹中,但它似乎没有从那里捡起它。
猜你喜欢
  • 2010-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-18
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多