CLR 如何定位 pdb 符号文件
Posted
技术标签:
【中文标题】CLR 如何定位 pdb 符号文件【英文标题】:How the CLR locates pdb symbol files 【发布时间】:2012-02-08 17:43:20 【问题描述】:我想知道 ,以及是否可以覆盖此行为。
我在网上查找(MSDN 和其他资源)但找不到好的答案。
在我的应用程序中,我将 DLL 放置在主 .EXE 路径的几个子目录中。
我想要一个 Symbols\ 目录,其中包含我的应用程序的所有符号。 默认情况下,我相信符号是从程序集所在的位置拾取的。这个可以改吗?
【问题讨论】:
发生托管异常时,会创建一个异常对象,并且当符号可用时,它包含带有文件信息的堆栈跟踪(源文件:行号)。我相信 CLR(或将堆栈跟踪添加到异常的任何人都会查询这些文件)。 顺便说一句,CLR 可能会调用其他 (Win32) 代码,因此它本身可能对 PDB 文件一无所知。 【参考方案1】:如果您还没有,请查看这篇博文:
http://blogs.msdn.com/b/rmbyers/archive/2007/06/21/customizing-pdb-lookup-for-source-information-in-stacktrace.aspx
【讨论】:
【参考方案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 构建,不确定这是否重要。在我的应用程序初始化的早期设置环境变量。我已将所有符号放在正确的文件夹中,但它似乎没有从那里捡起它。以上是关于CLR 如何定位 pdb 符号文件的主要内容,如果未能解决你的问题,请参考以下文章
多租户:Oracle Database 19c 中的 DBCA PDB 重定位
《CLR Via C#》Visual Studio编译之后的.pdb文件