如何告诉StackTrace在哪里找到它的PDB?

时间:2011-03-16 01:15:45

标签: c#

如果使用new StackFrame()new StackTrace()获取堆栈跟踪,我可以将“true”传递给fNeedFileInfo以获取文件和位置信息。这需要PDB文件才能工作。

我的问题是:CLR如何查找PDB文件?

我们的最终用户本地没有PDB,但它们在网络共享上可用。是否有可能告诉CLR何时进行堆栈跟踪?

2 个答案:

答案 0 :(得分:1)

CLR使用COM组件读取存储在框架目录中的.pdb文件,diasymreader.dll。仅记录此组件的编程接口(ISymUnmanagedReader)。 MSDN库中没有关于任何类型的配置选项的内容。 CLR也没有提供任何。

没有前途。但是,我确实在DLL的二进制转储中看到了一个注册表项。看起来像HKLM \ Software \ Microsoft \ VisualStudio \ MSPDB,其值为SymbolSearchPath。听起来很棒,通过使用Regedit.exe添加此键和值来尝试一下。使它成为一个字符串,包含带有.pdb文件的目录名称。

答案 1 :(得分:1)

CLR使用DIA(Debug Interface Access)API来解析源和线路信息。解析符号时,DIA尊重_NT_SYMBOL_PATH环境变量。您可以指定多个文件夹(本地或网络)或符号服务器。有关具体语法,请参阅here

鉴于此,您可以使用Environment.SetEnvironmentVariable为流程设置符号路径。例如......

Environment.SetEnvironmentVariable(
    "_NT_SYMBOL_PATH",
    @"\\local\symbol\share;srv*http://msdl.microsoft.com/download/symbols"
);

...指定您要在本地网络共享以及公共Microsoft符号服务器中查找符号。请注意,通过网络查找符号确实可以减慢速度。如果你正在使用StackTrace,这可能不是问题。