如果使用new StackFrame()
或new StackTrace()
获取堆栈跟踪,我可以将“true”传递给fNeedFileInfo
以获取文件和位置信息。这需要PDB文件才能工作。
我的问题是:CLR如何查找PDB文件?
我们的最终用户本地没有PDB,但它们在网络共享上可用。是否有可能告诉CLR何时进行堆栈跟踪?
答案 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
,这可能不是问题。