Debugging 符号,在Microsoft Windows调试工具中?

Debugging 符号,在Microsoft Windows调试工具中?,debugging,symbols,Debugging,Symbols,“符号”的需求/用途是什么 不久前,我花了一些时间试图找出调试器,但始终无法让它有任何意义(我试图调试服务器挂起…)。我的部分问题是没有合适的“符号” 它们是什么?为什么我需要它们?我不是在找文字吗 有没有比使用它更好的链接?如果您只有二进制文件,通常只能获得堆栈跟踪信息,可能还有二进制或IL(in.NET)指令。拥有这些符号可以让您将二进制/IL指令与源代码中的对应行进行实际匹配。如果您有源代码,它还允许您在VisualStudio中连接调试器并逐步完成源代码 在Windows二进制体系结构上

“符号”的需求/用途是什么

不久前,我花了一些时间试图找出调试器,但始终无法让它有任何意义(我试图调试服务器挂起…)。我的部分问题是没有合适的“符号”

它们是什么?为什么我需要它们?我不是在找文字吗


有没有比使用它更好的链接?

如果您只有二进制文件,通常只能获得堆栈跟踪信息,可能还有二进制或IL(in.NET)指令。拥有这些符号可以让您将二进制/IL指令与源代码中的对应行进行实际匹配。如果您有源代码,它还允许您在VisualStudio中连接调试器并逐步完成源代码

在Windows二进制体系结构上,调试所需的信息(函数名、文件和行号等)不存在于二进制本身中。相反,它们被收集到一个文件(程序数据库,文件扩展名.pdb)中,调试器使用该文件将二进制指令与调试时可能使用的各种信息关联起来

因此,为了调试服务器挂起,服务器应用程序本身和服务器调用的Windows二进制文件都需要PDB文件


总的来说,我对WinDbg的经验是,与之相比,学习如何使用WinDbg要困难得多,但一旦您了解了如何使用WinDbg,它的威力就会大得多。(有趣的是,与Windows/Linux工具的通常情况相反。)

您需要符号才能将地址转换为有意义的名称。例如,在每次函数调用时,堆栈上都有位置:

0x00003791
0x00004a42
符号允许调试器将这些地址映射到方法

0x00003791 myprog!methodnamea
0x00004a42 myprog!methodnameb
构建程序的调试版本时,编译器会发出扩展名为.PDB的符号。它还包含行信息,以便您可以进行源代码调试等

您需要正确设置符号搜索路径,以便调试器拾取该路径。在命令窗口中,您可以执行以下操作:

.sympath c:\symbols;c:\temp\symbols
为了让它在这些目录中搜索.PDB。它还将在运行可执行文件的同一目录中查找

使用MicrosoftPublicSymbols服务器也可能有帮助,这样您就可以解析操作系统二进制文件,如NTDLL、GDI等。。在开始时使用此路径:

.sympath SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols;c:\symbols
您需要首先创建c:\websymbols