我想知道CLR如何查找pdb符號文件,以及是否可以覆蓋此行爲。CLR如何查找pdb符號文件
我在網上查找(MSDN和其他資源),但找不到一個好的答案。
在我的應用程序中,我將DLL放置在主.EXE路徑的多個子目錄中。
我想有一個符號\ dir將包含我的應用程序的所有符號。 默認情況下,我相信符號是從程序集所在的位置拾取的。這可以改變嗎?
我想知道CLR如何查找pdb符號文件,以及是否可以覆蓋此行爲。CLR如何查找pdb符號文件
我在網上查找(MSDN和其他資源),但找不到一個好的答案。
在我的應用程序中,我將DLL放置在主.EXE路徑的多個子目錄中。
我想有一個符號\ dir將包含我的應用程序的所有符號。 默認情況下,我相信符號是從程序集所在的位置拾取的。這可以改變嗎?
你可以簡單地設置自己的進程_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");
}
}
這似乎不適用於我。只有在調試時或者我在其他地方部署我的應用程序時纔會起作用嗎? – 2012-01-15 08:05:34
我測試了這個沒有調試器並運行Release版本。我沒有看到一個好的失敗模式,除了沒有把.pdbs放在正確的子目錄中。 – 2012-01-15 10:40:00
我正在運行一個DEBUG構建,不知道是否重要。在初始化應用程序時儘早設置環境變量。我已將所有符號放在正確的文件夾中,但似乎沒有從中提取它。 – 2012-01-15 11:13:11
當發生託管異常時,會創建一個Exception對象,當符號可用時,它將包含帶有文件信息(源文件:行號)的堆棧跟蹤。我相信CLR(或者將堆棧跟蹤添加到異常的人查詢這些文件)。 – 2012-01-12 12:39:06
順便說一句,CLR可能會調用其他(Win32)代碼,所以部分原因在於它本身可能不知道有關PDB文件的任何內容。 – 2012-01-12 12:39:42