Microsoft 调试器中“符号”的需求/使用是什么?
我花了一些时间试图弄清楚调试器,但始终无法理解(我试图调试服务器挂起......)。我的部分问题是没有正确的“符号”。
这些是什么?为什么我需要它们?我不只是在寻找文字吗?
有没有比如何在几分钟内解决 Windows 系统崩溃更好的链接来使用它?
Microsoft 调试器中“符号”的需求/使用是什么?
我花了一些时间试图弄清楚调试器,但始终无法理解(我试图调试服务器挂起......)。我的部分问题是没有正确的“符号”。
这些是什么?为什么我需要它们?我不只是在寻找文字吗?
有没有比如何在几分钟内解决 Windows 系统崩溃更好的链接来使用它?
您需要符号才能将地址转换为有意义的名称。例如,在每次函数调用时,您的堆栈上都有位置:
0x00003791
0x00004a42
Symbols 允许调试器将这些地址映射到方法
0x00003791 myprog!methodnamea
0x00004a42 myprog!methodnameb
当您构建程序的调试版本时,编译器会发出扩展名为 .PDB 的符号。它还包含行信息,因此您可以进行源代码调试等。
您需要正确设置符号搜索路径,以便调试器选择它。在命令窗口中你可以做
.sympath c:\symbols;c:\temp\symbols
为了让它在这些目录中搜索 .PDB。它还将在运行可执行文件的同一目录中查找。
使用 Microsoft 公共符号服务器也可能会有所帮助,这样您就可以在开头使用以下路径解析 OS 二进制文件,例如 NTDLL、GDI 等:
.sympath SRV*c:\websymbols*http://msdl.microsoft.com/download/symbols;c:\symbols
您需要先创建 c:\websymbols。
在 Windows 二进制架构上,调试所需的信息(函数名、文件和行号等)并不存在于二进制本身中。相反,它们被收集到一个PDB文件(程序数据库,文件扩展名 .pdb)中,调试器使用该文件将二进制指令与您在调试时可能使用的各种信息相关联。
因此,为了调试服务器挂起,您既需要服务器应用程序本身的 PDB 文件,也需要服务器调用的 Windows 二进制文件的 PDB 文件。
作为一般说明,我对 WinDbg 的体验是,与GDB相比,学习如何使用它要困难得多,但是一旦你了解了如何使用它,它就会变得更加强大。(有趣的是,与 Windows/Linux 工具的常见情况相反。)
如果您只有二进制文件,您通常可以获得的唯一信息是堆栈跟踪,可能还有二进制或 IL(在 .NET 中)指令。有了这些符号,您实际上可以将该二进制/IL 指令与源代码中的相应行匹配。如果您有源代码,它还允许您在 Visual Studio 中连接调试器并逐步执行源代码。