5.3.3 在Linux环境里调试MySQL(2)
代码清单5-13是客户端程序给出的初始化信息,它将使用命令行中指定的套接字。接着发出SHOW AUTHORS命令。
代码清单5-13 启动MySQL客户端程序去连接服务器
当我输入SHOW AUTHORS命令的时候,注意到的***件事是客户端程序没有反应了。这是因为gdb调试器已经遇到了刚才设置的那个断点并暂停了程序的执行。现在,可以切换到调试器去发出调试命令了。可以用next命令单步执行,也可以用print命令显示变量的值(参见代码清单5-12)。在完成这次调试任务之后,就可以关闭服务器并退出调试器了。
gdb调试器是一个功能强大的工具,但用起来不像大多数集成化开发环境(integrated development environment,IDE)里的调试器那么方便。ddd调试器填补了这个空白,它向用户提供了一个健壮的图形化操作环境。
2.使用ddd调试器
GNU推出的ddd调试器是集成化调试器的一个典型例子。尽管不是专为某个IDE环境而开发的,ddd调试器还是可以让用户获得类似的体验。你可以启动想调试的程序并查看它的源代码。在使用这个集成化调试工具的时候,可以设置断点,暂停和开始被调试程序的执行,查看变量的值,查看栈的变化情况,甚至可以修改变量的值。
ddd调试器有好几个窗口。它的数据窗口显示着你想查看的所有数据项,源代码窗口(主显示区)显示着被调试程序的当前源代码,调试器控制台窗口显示着底层调试器(gdb)的输出。你既可以通过菜单去控制正在调试的程序,也可以通过调试器控制台窗口直接输入各种调试命令。
ddd调试器的内核是GNU gdb独立型调试器。ddd调试器的开发者在gdb调试器的基础上为它增加了一系列新的功能,这种充分利用别人的成果(gdb)而非另起炉灶的做法,正是开源理念所倡导的。不仅如此,除了gdb调试器,ddd调试器还支持另外几种独立型调试器,这使它成为一个多面手。事实上,它可以支持其底层调试器所支持的任何一种程序设计语言。ddd调试器在许多方面都称得上是一个集成化调试器的典型代表。只要程序是用它能够支持的语言编写的,它就能够提供所需要的调试功能。
我最欣赏的ddd调试器功能之一,是它你允许你把尚未完成的调试工作保存起来,等有时间的时候再接着干。这样一来,你就不必每次从头开始重复调试步骤了--只要你曾经调试过一个比较大的程序,就肯定能体会到该功能的优越。我建议大家这样来使用这个功能:当你把程序调试到即将发生故障现象的那一刻(比如说,刚进入你认为有缺陷的那个函数)时,把所有需要观察的变量和需要设置的断点都安排好,然后把这次调试会话保存起来。这样一来,万一接下来的调试出了什么差错,你可以立即回到刚才保存的位置重新开始而不必从头再来。这个办法虽然不如使用一个双向调试器那么有效率,但因此而节省下来的时间往往也相当可观。
还可以使用ddd调试器查看系统崩溃前保存的内存映像文件,这可以让你了解到在系统即将崩溃之前你的程序正处于什么状态,以及它***执行的几步操作。这个功能非常有用,因为会导致系统崩溃的缺陷往往也会让调试器陷入崩溃 。ddd调试器还支持远程调试和直接查看内存。换句话说,你可以在开发工作站上通过ddd调试器去调试一个运行在另一台计算机上的程序(那通常是一个服务器)。关于ddd调试器的更多信息可以在www.gnu.org/software/ddd/ddd.html#Doc上的文档里查到。
下面是用ddd调试器去调试MySQL系统时的基本步骤。
(1) 关闭所有正在运行的MySQL服务器。使用mysqladmin -uroot -p shutdown命令并输入你的root用户密码。
(2) 进入程序的源代码目录。比如说,如果你想调试的是MySQL服务器(mysqld),需要进入sql子目录。
(3) 用ddd mysqld-debug命令启动ddd调试器。
(4) 打开你想调试的源代码文件。在后面的讨论里,我将使用sql_show.cc文件作为例子。
(5) 把所有的断点设置好。在后面的讨论里,我将在show_authors()函数中的第207行设置一个断点。
(6) 通过Program Run菜单启动服务器运行。如果你想让服务器以root用户的权限运行,别忘了在对话框里给出参数-u root。
(7) 启动MySQL客户端程序。在后面的讨论里,我将使用最基本的MySQL命令行客户端程序。
(8) 在客户端程序里发出命令。调试器会在被调试的程序执行到事先安排好的断点位置时让它暂停下来,而调试工作就将从这里正式开始。
(9) 在完成调试工作之后,先退出调试器,再使用mysqladmin-uroot-p shutdown命令和你的root用户密码关闭服务器。
提示 你可能需要延长MySQL客户端程序的超时时。调试需要花费时间,如果你设置的断点较多或者是查看许多变量,花费的时间就更长,而在此期间系统实际上是处于等待状态的。如果等待时间过长,服务器与客户端程序之间的通信就会中断。有些客户端程序会在一定时间内无法与服务器进行通信时自动结束本次会话。如果你使用的是MySQL命令行客户端程序,将需要延长超时时间。可以在命令行上使用--connection-timeout=参数来设定这个值。比如说,--connection-timeout=600将把等待时间设置为600秒,这意味着你在客户端程序放弃连接之前有10分钟的调试时间。
代码清单5-14演示了用ddd调试器去调试MySQL服务器的情况。我在这里选用的例子与前面一样,还是来自sql_show.cc源代码文件的show_authors()函数。但在这个例子里,我感兴趣的是服务器如何把信息发送给客户端程序。读者应该记得,本书在第3章曾经说过,要在本章给出一个分析MySQL服务器是如何把数据返回给客户端程序的例子,下面就是这样一个例子。
代码清单5-14 show_authors()函数(请注意代码中的黑体字部分)
【责任编辑:云霞 TEL:(010)68476606】
点赞 0