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 符号文件的主要内容,如果未能解决你的问题,请参考以下文章

vs通过map pdb文件定位问题

多租户:Oracle Database 19c 中的 DBCA PDB 重定位

《CLR Via C#》Visual Studio编译之后的.pdb文件

“无法定位程序输入点nextafterf于动态链接库MSVCR120_CLR0400.dll上“完美解决方案!

如何更改符号文件 (pdb) 中源文件的位置

ELF格式解读-符号表