我想知道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