调试SQLSERVER (二)使用Windbg调试SQLSERVER的环境设置
时间:2022-03-14 04:18
上面看到worker thread在CHECKPOINT_QUEUE 队列里面等待CHECKPOINT 命令
大家可以看到加上符号文件之后,调试器会在stack trace相应的位置进行转换,例如在模块名那里加上模块名,在函数名那里加上函数名
<module_name>!<function call> or <module_name>!<class_name>::<method/function call>
设置符号路径
设置符号路径的作用是使调试器可以找到符号文件的位置并进行加载在调试的时候
简单介绍一下符号路径和公私有符号文件
私有符号文件:包含了调试会话中需要的所有符号信息(只对微软内部开放,微软私有财产)
公有符号文件:只是有选择地包含一些符号信息(对所有人开放)
符号信息隶属于指定的模块,只有调试器需要用到某个模块时,它的符号信息才有被加载和分析的必要。
要在调试器中使用符号,我们必须首先告诉调试器这些符号文件的位置,也就是设置符号路径。符号路径可以是本地文件夹路径、可访问的UNC路径、或者是符号服务器路径。
符号服务器:在调试过程中,需要涉及成千上万个符号文件,以及同一个符号文件存在不同平台下的不同符号文件版本的时候。
手动设置符号路径肯定是不现实的,于是引入了符号服务器的概念。
符号服务器有一套命名规则,使得调试软件能够正确找到需要的符号文件。一般来说,符号服务器比较大,都是共用的,放在远程主机上。
为了降低网络访问的成本,又引入了符号缓存的概念,即将从服务器上下载到的符号文件,保存在本地缓存中,以后调试器需要符号文件的时候,先从缓存中寻找,找不到的时候再到服务器上下载。
1、设置符号路径
设置符号路径的语法如下:
.sympath [+] [路径]
如要覆盖原来的路径设置,使用新路径即可:
.sympath <新路径>
要在原有路径的基础上添加一个新路径,可使用:
.sympath+ <新增路径>
如果不带参数,那么输出是当前设置的符号路径:
0:000> .sympath Symbol search path is: <empty> //尚未设置符号路径
假如在调试时,我知道需要的符号文件位于一下文件夹"D:\MyPdb“。
0:000> .sympath D:\MyPdb //覆盖原有符号路径 Symbol search path is: D:\MyPdb Expanded Symbol search path is: d:\mypdb
此时调试器将记录上面新的符号路径,但并不会从这个路径中加载任何符号,要指示调试器加载符号,可以使用元命令reload。
这个命令能枚举出进程地址空间中所有已加载的模块,并且尝试找出与各个模块相关的符号文件。
0:000> .reload Reloading current modules .....
如果调试器在指定目录无法找到文件,那么它会输出错误提示:
*** ERROR:Symbol file could not be found. Defaulted to export symbols for xxx.dll
当没有设置本地缓存路径时,那么调试器将使用调试软件的安装路径下的sym文件夹。
要特别注意的是,使用.sympath改变或新增符号路径后,符号文件并不会自动更新,应再执行.reload命令以进行更新。
2、符号服务器与符号缓存
设置符号服务器的基本语法是:
SRV*[符号缓存]*服务器地址
语法有SRV引导,符号缓存和服务器地址的前面各有一个星号引导。
此外,我们总是应该把微软的公用符号库加入到我们的符号路径中:
.sympath+ srv*<缓存地址>*http://msdl.microsoft.com/download/symbols
这是一台微软对外公开的服务器,使用http地址访问,不是所有人都能牢记这个网址,所以最好的办法就是使用.symfix命令(自动记忆了上面那个微软符号服务器地址),语法如下:
.symfix [+] [符号缓存地址]
下面的命令等价于上面的.sympath命令,而不用输入长长的http地址。
0:010> .symfix c:\windows\symbols 0:010> .sympath Symbol search path is: srv* Expanded Symbol search path is: SRV*c:\windows\symbols*http://msdl.microsoft.com/download/symbols
以上设置后,当需要用到符号,Windbg将自动到服务器上去下载,然后保存在C:\windows\symbols
当然,我们也可以在计算机上面设置,设置方式是:
我的电脑=》高级系统设置=》高级Tab,点击环境变量,新建一个用户变量如
变量名:_NT_SYMBOL_PATH
变量值:SRV*D:\PDB*http://msdl.microsoft.com/download/symbols/
或者
在安装完符号文件之后,指定固定的路径
变量名:_NT_SYMBOL_PATH
变量值:C:\windows\symbols
2、重新加载
如果对自己正在使用的符号文件感到疑惑,比如源代码和行号明显不匹配,最好就是重新加载一下符号文件。此命令语法如下:
.reload /f /v [模块名]
.reload命令的作用是删除指定或所有已加载的符号文件,默认情况下,调试器不会立刻根据符号路径重新搜索并加载新的符号文件,而是推迟到调试器下一次使用此文件时。
使用/f参数将破事调试器立刻搜索并重新加载新的符号文件。
其它参数解释如下:
/v:将搜索过程中的详细信息都显示出来。
/i:不检查pdb文件的版本信息;
/l:只显示模块信息,内核模式下,和“lm n t”命令类似,但显示内容比后者更多,因为包含了用户模块信息;
/n:仅重载内核符号,不重载用户符号;
/o:强制覆盖符号库中的符号文件,即使版本相同;
/d:用户层模式下使用Windbg时的默认选项,重载调试器模块列表中的所有模块;
/s:内核模式下使用Windbg时的默认选项,重载系统模块列表中的所有模块,另外,如果调试器在用户模式下运行,要加载内核模块,也必须使用/s选项,否则调试器将只会在调试器模块列表中搜索而导致找不到内核模块;
/u:卸载指定模块。如发现当前符号版本不对,使用/u开关先卸载之再重新加载。
下面命令重新加载sqlservr模块
.reload /f sqlservr.exe
上面讲了一大堆,什么符号服务器,什么符号缓存,但是我们一般只使用本地符号文件,实际上概括起来我们设置符号路径一般的做法就是
1、下载公有符号文件,并安装,然后设置
地址:
双击下载下来的安装包,然后安装
下面这个路径一定要记住!!
安装完毕之后就可以在E:\Symbols\路径下 看到安装好的pdb
pdb文件
2、在Windbg里面设置symbols文件夹的位置
我们随便加载一个mdmp文件
打开dump文件之后,在Windbg的命令框依次输入下面命令
.sympath E:\Symbols
重新加载
.reload
然后再输入 .sympath 就会看到当前符号路径是E:\Symbols
当然,我们不可能每次调试dump文件的时候都指定一次符号路径,我们可以把符号路径添加到环境变量里
这样下次再打开Windbg的时候就不用再指定多一次符号路径
我们再次打开Windbg,可以发现Windbg会首先从环境变量里查找符号路径,下图看到Windbg已经查找成功
这样就省去了我们每次设置符号路径的麻烦
总结
这样我们的调试环境就弄好了,下篇会介绍Windbg的一些命令
参考文章:
关于符号路径,符号服务器,符号文件的更多内容请参考:
欢迎大家拍砖o(∩_∩)o