用于 Visual Studio 的 MySQL  /  第 11 章调试存储过程和函数

第 11 章调试存储过程和函数

存储过程调试器提供用于设置断点、单步执行单个语句(Step Into、Step Out、Step Over)、评估和更改局部变量值、评估断点和其他调试任务的工具。

特权

调试器会在每个调试会话开始时 serversidedebugger在您的服务器中重新创建一个数据库。该数据库有助于跟踪检测代码并在调试例程中实现可观察性逻辑。您当前的连接需要具有创建该数据库及其关联的存储例程、函数和表的权限。

调试器在后台进行更改以临时将检测代码添加到您调试的存储例程中。您必须拥有ALTER ROUTINE您调试的每个存储过程、函数或触发器的权限。(包括您正在调试的过程所调用的过程和函数,以及触发的触发器。)

启动调试器

要启动调试器,请执行以下步骤:

  1. 在 Visual Studio 服务器资源管理器中选择一个连接。

  2. 展开Stored Procedures文件夹。只能直接调试存储过程。要调试用户定义的函数,请创建调用该函数的存储过程。

  3. 单击一个存储过程节点,然后右键单击并从上下文菜单中选择Debug Routine

    图 11.1 选择要调试的存储例程

    存储过程调试器的屏幕截图,展示了如何选择要调试的存储例程

用法

此时,Visual Studio 切换到调试模式,以步进模式打开正在调试的例程的源代码,位于第一条语句上。

如果您调试的初始例程有一个或多个参数,弹出窗口将显示一个网格(每个参数一行,三列:一列用于参数,一列用于参数值(这是可编辑的),一列用于Nullifying that argument value (a check box). 设置所有参数值后,您可以按 OK开始调试会话,或 按Cancel取消调试会话。

图 11.2 设置参数(第 1 个,共 2 个)

设置参数(第 1 个,共 2 个)

图 11.3 设置参数(第 2 个,共 2 个)

设置参数(第 2 个,共 2 个)

调试器的功能

为了了解存储例程的内部工作情况,调试器准备了一个特殊版本的过程、函数或正在调试的触发器,并使用额外的代码进行检测,以跟踪正在进入的当前行和所有本地变量的值变量。从正在调试的例程中调用的任何其他存储过程、函数或触发器都以相同的方式进行检测。例程的调试版本会自动为您准备好,当调试会话结束时(通过按F5Shift + F5),例程的原始版本会自动恢复。

每个检测例程的原始版本(没有检测的版本)的副本存储在 AppData\Roaming\MySqlDebuggerCache当前 Windows 用户的文件夹中(通过 System.Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 在 .NET 中调用返回的路径,加上附加MySqlDebuggerCache的。每个检测例程都有一个文件,名为 routine_name.mysql.例如,在 Windows 7 中,对于名为 的用户 fergs,路径为 C:\Users\fergs\AppData\Roaming\MySqlDebuggerCache

使用了两个线程,一个用于调试器,一个用于被调试的例程。线程严格交替运行,在存储例程中执行每个语句时在调试器和例程之间切换。

基本调试操作

该调试器与用于 C#、VB.NET 或 C++ 的标准 Visual Studio 调试器具有相同的外观和感觉。特别是,以下内容是正确的:

当地人和手表

  • 要显示Locals选项卡,请选择菜单项DebugWindowsLocals

    Locals选项卡列出了当前作用域中所有可用 的变量: DECLARE在例程中的任何一点定义的变量、参数参数和引用的会话变量。

  • 如果最后一步操作改变了一个局部的值,它的值将以红色突出显示(直到执行或步进另一个语句。

  • 您可以更改任何本地的值。

  • 要显示Watch选项卡,请选择菜单项DebugWindowsWatch

    要定义监视,请键入任何有效的 MySQL 表达式,可以选择包括函数调用。如果 watch 评估在当前上下文(当前堆栈帧)中有意义,它将显示其值,否则它将在定义 watch 的同一行中显示错误消息。

  • 调试触发器时,除了声明的任何局部变量或引用的会话变量之外,还将列出新对象和旧对象(如果适用)。例如在触发器中 INSERT,对于定义如下的表:

    create table t1( id int, myname varchar( 50 ));

    当地人将列出额外的变量 new.idnew.myname。对于UPDATE触发器,您还将获得额外的变量old.idold.myname. 这些来自新对象和旧对象的变量可以像任何普通局部变量一样进行操作。

    图 11.4 调试触发器

    调试触发器

调用堆栈

  • 要显示Call Stack选项卡,请选择菜单项DebugWindowsCall Stack

  • 堆栈跟踪(在“调用堆栈”选项卡中)将列出所有堆栈跟踪,每个例程调用一个。带有黄色标记的是当前的步进点。单击另一个将在编辑器中激活该例程源的选项卡,以绿色突出显示最后一步的语句。

    图 11.5 调用堆栈

    调用堆栈

步进

  • 新例程的步进从第一条可执行指令开始(不包括声明、处理程序、游标声明等)。

    图 11.6 调试步进

    调试步进

    图 11.7 函数步进(第 1 个,共 2 个)

    函数步进(第 1 个,共 2 个)

    图 11.8 函数步进(第 2 个,共 2 个)

    函数步进 (2 of 2)

  • 要进入条件处理程序的代码,必须在 MySQL 例程的其余部分触发条件。

  • 下一条要执行的语句以黄色突出显示。

  • 要继续单步执行,您可以在Step Into(按F11)、 Step Out(按 F10)或Step Over(按Shift + F11)之间进行选择。

  • 您可以跳出任何函数、触发器或存储过程。如果您从主例程中退出,它将运行该例程直至完成并结束调试会话。

  • 您可以跳过存储过程调用、存储函数和触发器。(要跨过触发器,请跨过会导致触发器触发的语句。)

  • 单步执行单个语句时,调试器将单步执行该语句调用的每个单独函数以及该语句触发的每个触发器。它们被调试的顺序与 MySQL 服务器执行它们的顺序相同。

  • INSERT您可以进入由、 DELETEUPDATEREPLACE语句 触发的触发器 。

  • 此外,您进入存储函数或触发器的次数取决于函数评估或触发器影响的行数。例如,如果您按 F11 ( Step Into ) 进入 UPDATE修改三行的语句(为SET 子句中的列调用函数,从而为三行中的每一行调用该函数),您将进入该函数三次连续,每行一次。您可以通过禁用给定存储函数中定义的任何断点并按Shift + F11来加速此调试会话走出去。在此示例中,调试存储函数的不同实例的顺序是特定于服务器的:当前 MySQL 服务器实例使用相同的顺序来评估三个函数调用。

断点

  • 要显示Breakpoints选项卡,请选择菜单项DebugWindowsBreakpoints

  • Breakpoints选项卡将显示所有定义的断点 。从这里,您可以一个接一个或一次全部启用和禁用断点(使用“断点”选项卡顶部的工具栏)。

  • 您只能在调试会话中间定义新断点。单击任何 MySQL 编辑器的左侧灰色边框,或单击 MySQL 编辑器中的任意位置并按 F9。在熟悉的 Visual Studio 方式中,您按一次F9以在该行中创建一个断点,然后再按一次以删除该断点。

  • 定义断点后,它将显示为启用(如果该行是放置断点的有效语句,则显示为当前行左侧的实心红色圆圈)或禁用(如果该行是当前行左侧的非实心红色圆圈,如果该行放置断点是无效的)。

  • 要定义条件断点,在创建断点后,右键单击红点并选择 Condition ...。如果条件是Is TrueHas changed ,您可以在那里放置任何有效的 MySQL 表达式和状态。前者在每次条件为真时触发断点,后者在每次条件值改变时触发。(如果定义了条件断点,单步进入定义了断点的行不足以触发这样的断点。)

    图 11.9 条件断点

    条件断点

    图 11.10 表达式和断点

    表达式和断点

  • 要定义传递计数断点,在创建断点后,右键单击红点并选择 Hit Count ...。在弹出的对话框中,定义要设置的具体条件。例如, 当命中计数等于时中断,值为 3 将在第三次命中时触发断点。

其它功能

  • 要中止调试会话(以及当前例程调用堆栈的执行),请按Shift + F5

  • 要运行例程直至完成(或直到遇到下一个断点),请按F5

  • 对于您可以使用的所有功能(除了记录的快捷方式),请参阅 Visual Studio 的“调试”菜单中的选项。

限制

  • 被调试的代码不得使用get_lock MySQLrelease_lock函数,因为调试器基础结构在内部使用它们来同步调试器和被调试例程。

  • 被调试的代码必须避免使用任何事务代码 ( START TRANSACTION, COMMIT, ROLLBACK),因为可能会清除调试器表的内容。(将来可能会取消此限制)。

  • 您无法调试 serversidedebugger数据库中的例程。

  • 运行被调试例程的MySQL服务器可以是5.0之后的任何MySQL服务器版本,运行在任何支持的平台上。

  • 始终在测试和开发服务器上运行调试会话,而不是针对 MySQL 生产服务器,因为调试会导致临时性能问题甚至死锁。正在调试的例程的检测版本使用可能与其余生产代码不相关的锁。

键盘快捷键

以下列表总结了用于调试的键盘快捷键:

  • F9切换断点

  • F11:进入一次

  • F10:跳过一次

  • Shift + F11:退出一次

  • F5:运行

  • Shift + F5:中止当前调试会话