PostgreSQL 教程: 使用 pgAdmin 4 调试 PL/pgSQL 函数

十月 6, 2023

摘要:pgAdmin 的调试器可用于调试 PL/pgSQL 函数,以及 PostgreSQL 中的存储过程。调试器可作为 PostgreSQL 安装的扩展。您必须具有超级用户权限才能使用调试器。

Debugger page

在使用调试器之前,必须修改 postgresql.conf 文件,将服务器端调试器组件添加到 shared_preload_libraries 参数的值中,例如:

shared_preload_libraries = ‘$libdir/plugin_debugger’

修改 shared_preload_libraries 参数后,重新启动服务器以应用更改。

调试器可用于目标函数或过程的上下文调试或直接调试。当您使用调试器进行上下文调试时,您可以在程序的第一行设置一个断点;当会话调用目标函数时,控制权将转移到调试器。使用直接调试时,调试器会提示您输入目标函数所需的任何参数,然后允许您单步调试代码。

上下文调试

要在程序的第一行设置断点,请右键单击要调试的对象的名称,然后从 调试 子菜单中选择 设置断点。调试器窗口将打开,等待另一个会话调用该程序。

Debugger set a breakpoint demo

当另一个会话调用目标函数时,调试器将显示代码,允许您添加断点或逐行单步执行。另一个会话暂停,直到调试完成;然后控制权返回到会话。

Debugger step-in demo

直接调试

要使用调试器进行直接调试,请在 pgAdmin 对象浏览器中右键单击要调试的对象的名称,然后从 调试 子菜单中选择 调试。调试器窗口将打开,提示您输入程序所需的任何值:

Debugger parameter dialog

使用 调试器 对话框上的字段为每个参数提供值:

  • Name 字段包含形式参数名称。
  • Type 字段包含参数数据类型。
  • Null? 检查框指示参数是否为 NULL 值。
  • Expression? 检查框指示 Value 字段是否包含表达式。
  • 使用 Value 字段提供传递给程序的参数值。输入参数值时,将值键入网格上的相应单元格,或者将单元格留空以表示 NULL,输入 ''(两个单引号)以表示空字符串,或者输入包含两个单引号的文字字符串。PostgreSQL 8.4 及更高版本支持可变函数参数。这些可以作为逗号分隔的值列表输入,根据需要进行引用或强制转换。
  • Use default? 检查框指示程序应使用 Default Value 字段中的值。
  • Default Value 字段包含参数的默认值。

提供程序所需的值,然后单击 调试 按钮开始单步执行程序。此处提供的参数值将被保存。下次打开对话框时将预先填充这些值。要清除值,请使用 全部清除 按钮。

Debugger step-in demo

使用调试器

主调试器窗口由两个面板和一个上下文相关的工具栏组成。使用工具栏图标来管理断点并单步执行代码;将鼠标悬停在图标上会出现工具提示,该提示标识与该图标关联的选项。工具栏选项有:

Debugger navigation toolbar

选项 动作
步入 (Step into) 单击 步入 图标以执行当前高亮显示的代码行。
跳过 (Step over) 单击 跳过 图标可执行一行代码,单步执行该代码调用的任何子函数。子函数会执行,但不会被调试,除非它包含断点。
继续/开始 (Continue/Start) 单击 继续/开始 图标执行高亮显示的代码,然后继续执行,直到程序遇到断点或完成。
断点开关 (Toggle breakpoint) 使用 断点开关 图标启用或禁用断点(不删除断点)。
清除所有断点 (Clear all breakpoints) 单击 清除所有断点 图标可从程序中删除所有断点。
停止 (Stop) 单击 停止 图标可停止程序的执行。
帮助 (Help) 单击 帮助 图标可打开调试器文档。

调试器窗口的顶部面板显示程序主体;单击行号旁边的灰色边距以添加断点。顶部面板中高亮显示的行是即将执行的行。

Debugger main window

调试器窗口的下部面板提供了一组选项卡,可让您查看有关程序的信息:

  • Parameters 选项卡显示每个参数的值。
  • Local Variables 选项卡显示程序变量的当前值。
  • Messages 选项卡显示服务器返回的所有消息(错误、警告和信息性消息)。
  • 程序完成时,Results 选项卡会显示服务器消息。
  • Stack 选项卡显示已调用但尚未完成的函数列表。

当您单步执行程序时,Local Variables 选项卡会显示每个变量的当前值:

Debugger local variables tab

当您单步执行子例程时,Stack 选项卡会显示调用堆栈,包括每个调用者的名称、每个调用者的参数值(如果有)以及每个调用例程内的行号:

Debugger local stack tab

选择一个调用者将焦点更改到它的栈帧,并在上部面板中显示调用者的状态。

程序完成后,Results 选项卡将显示服务器返回的消息。如果程序遇到错误,Messages 选项卡会显示详细信息:

Debugger error message