2012-01-12 70 views
8

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

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

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

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

+0

当发生托管异常时,会创建一个Exception对象,当符号可用时,它将包含带有文件信息(源文件:行号)的堆栈跟踪。我相信CLR(或者将堆栈跟踪添加到异常的人查询这些文件)。 – 2012-01-12 12:39:06

+0

顺便说一句,CLR可能会调用其他(Win32)代码,所以部分原因在于它本身可能不知道有关PDB文件的任何内容。 – 2012-01-12 12:39:42

回答

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"); 
    } 
} 
+0

这似乎不适用于我。只有在调试时或者我在其他地方部署我的应用程序时才会起作用吗? – 2012-01-15 08:05:34

+0

我测试了这个没有调试器并运行Release版本。我没有看到一个好的失败模式,除了没有把.pdbs放在正确的子目录中。 – 2012-01-15 10:40:00

+0

我正在运行一个DEBUG构建,不知道是否重要。在初始化应用程序时尽早设置环境变量。我已将所有符号放在正确的文件夹中,但似乎没有从中提取它。 – 2012-01-15 11:13:11