这篇文章我想探究下SQL Server里完全不同的领域:如果使用WinDbg(来自针对Windows的调试工具)调试SQL Server。在我们进入枯涩细节之前,我想详细解释下为什么选择这样晦涩的话题来写这篇文章。

缘由

当使用SQL Server时,你到底需不需要像WinDbg这样的调试器?简单回答:从不需要!SQL Server是一个稳定的产品,使用它提供的技术(扩展事件,DMVs/DMFs)进行故障排除已经可以了,从不会用到WinDbg。如果你有疑问的话,在你独自尝试调试讨厌的SQL Server问题前,你应该首先联系PSS。那使用像WinDbg的调试器的原因是什么?对我来说主要是教学,学习在SQL Server内部是如何工作的,还有关系数据库引擎是如何实现的。当我处理SQL Server问题时,有时候会看到在SQL Server里疯狂的事情,这是我要去解释的。因此我对SQL Server知道得更多,还有SQL Server如何工作的,对我来说是越好。

我使用WinDbg只出于教育目的,只在非生产的测试系统,为了更好的理解当执行查询时,SQL Server内部发生了什么。为此我们还要了解更多Windows系统的概念,用户模式调试,64位汇编语言,还有64位机器架构等。另外也要翻阅大量白皮书介绍关系数据库引擎是如何实现的。使用WinDbg我可以从内部看SQL Server,用哪个方式SQL Server实现它的功能,还有这些是如何一起工作的。最重要的是:像极客(geeky)一样去使用WinDbg调试器,大家都乐此不彼。

正题

在我们进入如何详细配置WinDbg对SQL Serve调试前,首先我想给你讲下SQL Server里最重要的DLL文件,在调试时我们会用到。我们来看下面图片:

我们知道,SQL Server本身是在可执行的sqlservr.exe里实现。在启动期间,sqlservr.exe会加载多个DLL文件到它的进程空间。从调试角度来说——下列是重要的几个DLL文件:

  • sqldk.dll (SQL Server开发包)目前实现SQL OS的大部分功能——这个OS是SQL Server的一部分,用来处理线程调度和内存管理(thread scheduling and memory mangement)。
  • sqlmin.dll实现所有关系引擎本身相关的功能,包括存储引擎(Storage Engine),数据访问方法(Data Access Methods),锁管理器(Lock Manager),日志管理器(Log Manager),惰性写入器(LazyWriter),还有其他组件。对于调试来说,它是最重要的一个,因为它包含SQL Server大多数熟知的组件。
  • sqllang.dll包含所有与T-SQL语言相关的功能,还有查询处理器(Query Processor)本身。

为了使用WinDbg,你需要先安装这个调试工具,它可以从微软免费下载:用于 Windows 的独立调试工具 (WinDbg)

https://msdn.microsoft.com/zh-cn/windows/hardware/gg463028#Download_windows

(貌似微软网站都很难下载,现提供单独下载地址:

x86位版本下载:【微软官方安装版

x64位版本下载:【微软官方安装版

安装完成后,在开始菜单里就可以找到这个程序:

警告:附加debugger到sqlserver进程会停止SQLSERVER的运行,切记不要在生产环境上乱试!!!

当你启动WinDbg时,请确认你的账户有管理员权限,不然的话你是不能附加到像sqlservr.exe这样的进程。为了使用WinDbg,你需要配置符号表(symbols)。符号表文件是用来解码内存地址,对应函数名称,这样更容易我们调试和理解。当你使用符号表是,你要区分公共和私有符号表。除了微软能访问公共符号,我们只能访问私有符号。公共符号是私有符号的子集,不包括更有趣的东西,例如:

  • 数据类型定义
  • 本地变量定义
  • 函数参数

公共符号仅提供你函数名称——没别的信息!与私有符号相比,我们需要习惯它的巨大限制。但是另一方面,微软想要保护它们的知识产权。不过只拿到用于调用堆栈(call-stacks)完整函数名称,在它们上面设置断点,通过它们调试,就可以大大帮助你理解SQL Server内部是如何工作的。只要你正确配置了WinDbg,对于你调试的指定内建SQL Server,你拿到自动正确的公共符号。你也可以尝试本地内核模式调试(local Kernel Mode Debugging),你甚至可以拿到内核模式的正确符号——但这是另外一回事……在WinDbg里你要配置微软公共符号的服务器地址,这样的WinDbg就可以正常下载它们。地址是:

http://msdl.microsoft.com/download/symbols

我是用批处理命令运行WinDbg,设置正确的符号服务器地址,直接附加到sqlservr.exe进程。

首先我们在命令提示符里切换到WinDbg所在目录:

CD C:\Program Files\Debugging Tools for Windows (x86)

然后使用如下命令:

windbg -y srv*g:\symbols*http://msdl.microsoft.com/download/symbols -pn sqlservr.exe

你必须确保只有一个SQL Server实例在运行,因为WinDbg是通过进程名称sqlservr.exe来附加的。如果你有多个SQL Server实例运行,你要指定正确的PID,这个可以从任务管理器拿到。

使用如下的命令:

windbg -y srv*g:\symbols*http://msdl.microsoft.com/download/symbols -p 384 

路径g:\symbols是你电脑上的位置,用来存储下载的符号表。那个位置的大小会改变,因为你会不停的下载大量的符号文件。我本地的符号文件现在有1G的大小……如果一切正常,你现在应该可以附加到sqlservr.exe:

程序执行现在已经停止了,因为你碰到了ntdll模块里的断点。ntdll是系统提供的一个简单的封装DLL,用来进行用户模式到内核模式的转换。这也意味着现在SQL Server里的“每个”线程都已经停止了,不能进行任何操作!!!请不要尝试在生产环境里将WinDbg附加到sqlservr.exe!!如果你像恢复sqlservr.exe的运行,按键盘上的F5即可——SQL Server就再次恢复运行了。如果你想再次中断程序执行,你需要设置sqlservr.exe的进程空间里的断点,或者通过键盘快捷键CTRL+BREAK。

如果你用那个快捷键中断运行,WinDbg会把你放在sqlservr.exe的某个特定线程上。如果你想分析特定内存地址或者像设置具体断点用作进一步的故障排除,推荐你这么做。在WinDbg里一个非常重要呢个的命令是x命令:它会返回你指定模块里所有定义的符号。我们来看下面的命令:

x sqlmin!*BTree*

这个WinDbg命令会返回你所有名称包含“BTree”的函数名列表。这样的话,你就可以在指定的函数名上设置断点进行分析。返回函数名称如下格式:

module_name!class_name::function_name

例如sqlmin!BTreeMgr::Seek。如果你像返回BTreeMgr类定义的所有函数,可以使用下列命令:

x sqlmin!BTreeMgr::*

X命令是一个非常强大的命令,用来探索SQL Server实现的各个类。给你留点家庭作业,回答下列问题:

  • 哪个类里实现了锁管理器(Lock Manager)? sqlmin!LockManager::*
  • 哪个函数用来获得和释放闩锁(latches)? sqlmin!BUF::AcquireLatch和sqlmin!BUF::ReleaseLatch
  • 哪个类名实现SQLOS的调度? sqldk!SOS_Scheduler

欢迎在评论里回答上述问题。

小结

这篇文章我已经给你介绍了WinDbg的入门,还有你如何使用这个调试器附加到SQL Server。你已看到,sqlservr.exe进程空间里包含多个DLL文件,在那里每个DLL实现了SQL Server的各个组件功能。当你已经正确配置好公共符号的路径,你就可以获得组成SQL Server的各个类和函数的元数据信息。这里WinDbg的x命令是你的好助手。

希望你会喜欢这个特别的文章,下次我会为你介绍如何使用WinDbg指令来调试和执行SQL Server查询。

感谢关注!

参考文章:

https://www.sqlpassion.at/archive/2014/05/05/sql-server-debugging-with-windbg-an-introduction/

使用WinDbg调试SQL Server——入门的更多相关文章

  1. 使用WinDbg调试SQL Server——入门:Woodytu

    http://www.cnblogs.com/woodytu/p/4663525.html https://www.sqlpassion.at/archive/2014/05/13/debugging ...

  2. 使用WinDbg调试SQL Server查询

    上一篇文章我给你介绍了WinDbg的入门,还有你如何能附加到SQL Server.今天的文章,我们继续往前一步,我会向你展示使用WinDbg调试SQL Server查询需要的步骤.听起来很有意思?我们 ...

  3. 如何设断点????-----使用WinDbg调试SQL Server查询

    http://www.cnblogs.com/woodytu/p/4665427.html http://www.sqlservercentral.com/blogs/aschenbrenner/20 ...

  4. Windbg调试Sql Server 进程

    http://blog.csdn.net/bcbobo21cn/article/details/52261466 http://www.sqlservercentral.com/blogs/asche ...

  5. WinDbg调试.NET程序入门

    俗话说:万事开头难! 自从来到新公司遇到性能问题后,需要想办法解决这个问题,但是一直没有合适的性能分析工具,然后找到StevenChennet 大神帮忙,他用WinDbg工具远程帮我分析了一个 dum ...

  6. VS调试SQL Server存储过程

    1.打开VS,视图-->SQL Server对象资源管理器.(我用的是VS2012) 2.添加链接,连接到数据库. 3.选择要调试的存储过程,右键,选择调试过程或者执行过程. 4.填写存储过程所 ...

  7. 调试SQL Server的存储过程及用户定义函数

    分类: 数据库管理 2005-06-03 13:57 9837人阅读 评论(5) 收藏 举报 sql server存储vb.net服务器sql语言 1.在查询分析器中调试 查询分析器中调试的步骤如下: ...

  8. c#操作SQL Server入门总结

    我是一名c#新手.本文只是我是常学习的随笔. 一.下载SQL server软件 听说下载开发板是最好的(开发板如果只是用来学习.研究不算是侵权).在安装的时候,我也遇到了很多问题,在公司的电脑安装第一 ...

  9. 存储过程系列之调试存储过程 SQL Server 2005

    在数据库中直接调试  在数据库中直接调试是调试SQL Server 2005的存储过程的最简单的方法. 在Visual Stuido的IDE中你可以选择单步执行存储过程,然后就可以一条语句一条语句地单 ...

随机推荐

  1. .NET中的流

    当应用程序需要和磁盘上的文件打交道的时候,就有了流的概念.流就像架设在应用程序所在内存和磁盘之间的一个管道. 大致思路 → 建立管道 //FileMode.Open打开现有文件,另外还有FileMod ...

  2. 深入分析Java Web技术(1)

    BS网络模型的基本过程: 当我们在浏览器中输入"www.google.com"的时候,首先会请求DNS服务器对域名进行解析成都应的IP地址,然后根据这个IP地址在互联网上找到谷歌的 ...

  3. [界面开发新秀]AYUI开发360领航版系列教程-AyWindow接入[1/40]

    开发包DLL下载地址:请加入 466717219群,自己下载(已经发布ayui3.7,在群里,为了不让你作为收藏工具,也只有入群才能下载,喜欢你就进.不喜欢你还是不要来了) AYUI初衷:简单化商业软 ...

  4. Storage Systems topics and related papers

    In this post, I will distill my own ideas and my own views into a structure for a storage system cou ...

  5. 【转】安装OpenSSL缺失Microsoft Visual C++ 2008 Redistributables的解决方案

    from: http://www.cnblogs.com/luguo3000/p/3539815.html 在安装OpenSSL的时候通常会提示以下错误: "The Win32 OpenSS ...

  6. iOS杂谈-图片拉伸的实现

    如上图是一个按钮的背景图,在Android上,很多图片资源都是类似这样子的,但是由于按钮的高度及宽度与图片的世纪尺寸不同,所以需要采用9patch来实现拉伸处理, 可参考:http://www.cnb ...

  7. 实现仿知乎的开场动画,图片zoomin的效果,实现原理,没加动效

    知乎等应用的开场动画是:全屏显示一副图像,并以图像的中间为原点,实现放大(也就是zoomin)的动画,让等待的过程不再单调乏味. 最近不是很忙,因此想了下如何实现这种效果,方案是:采用调整imagev ...

  8. iOS开发——高级技术精选&底层开发之越狱开发第一篇

    底层开发之越狱开发第一篇 做越狱开发也有一些时间了,有很多东西想总结一下,希望给他人一些借鉴,也是自己对过去开发经历的一些总结.个人不推荐使用盗版,这里主要以技术介绍为主. 这个系列里面主要介绍怎样进 ...

  9. Spring4 MVC Hibernate4集成

      Spring4 MVC Hibernate4集成 一.    本文所用环境 Spring4.0.3.RELEASE Hibernate4.3.5.Final Mysql 二.    工程目录 三. ...

  10. [原创]Android插件化的一种实现

    Android的插件化已经是老生常谈的话题了,插件化的好处有很多:解除代码耦合,插件支持热插拔,静默升级,从根本上解决65K属性和方法的bug等等. 下面给大家介绍一下我们正在用的插件化框架.本片主要 ...