2011-03-16 85 views
3

如果通过使用new StackFrame()new StackTrace()获得堆栈跟踪,我可以将“true”传递给fNeedFileInfo以获取文件和位置信息。这需要一个PDB文件才能工作。如何告诉StackTrace在哪里可以找到它的PDB?

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

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

回答

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,这可能不是问题。

+0

我认为这会对我们有用,谢谢。 – scobi 2011-03-16 17:12:40

1

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

不大可能。但是,我在DLL的二进制转储中看到一个注册表项。看起来像一个名为SymbolSearchPath的HKLM \ Software \ Microsoft \ VisualStudio \ MSPDB。听起来像是一场精彩的比赛,通过使用Regedit.exe添加这个键和值来给它一个镜头。使其成为一个字符串,包含具有.pdb文件的目录名称。

相关问题