我花了一些时间试图找出调试器一段时间后,从来没有能够让它有任何意义(我试图调试服务器挂起......)。我的部分问题是没有正确的'符号'。
他们是什么?为什么我需要它们?我不只是在寻找文字吗?
是否有比 How to solve Windows system crashes in minutes 更好的链接使用它?
答案 0 :(得分:6)
您需要符号才能将地址转换为有意义的名称。例如,每次函数调用时堆栈上都有位置:
0x00003791
0x00004a42
符号允许调试器将这些地址映射到方法
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。
答案 1 :(得分:2)
在Windows二进制体系结构中,调试所需的信息(函数名,文件和行号等)不存在于二进制文件本身中。相反,它们被收集到PDB文件(Program DataBase,文件扩展名.pdb)中,调试器使用该文件将二进制指令与您在调试时可能使用的各种信息相关联。
因此,为了调试服务器挂起,您需要PDB文件既可以用于服务器应用程序本身,也可以用于服务器调用的Windows二进制文件。
总的来说,我对WinDbg的体验是,与GDB相比,学习如何使用它要困难得多,但是一旦你理解了如何使用它就会有更大的力量。 (与Windows / Linux工具的常见情况相反,有趣的是。)
答案 2 :(得分:0)
如果你只有二进制文件,你通常可以得到的唯一信息是堆栈跟踪,也许是二进制或IL(在.NET中)指令。使用符号可以实际将二进制/ IL指令与源代码中的相应行匹配。如果您有源代码,它还允许您在Visual Studio中连接调试器并逐步执行源代码。