2012-01-12 69 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