金仓数据库KingbaseES PLSQL调试工具-基础功能
关键字:
KingbaseES、调试工具、plsql_pldbgapi、基础功能、人大金仓、KingbaseES
开发人员在编写、测试代码的过程中,经常要用到调试工具来帮助分析代码中的问题和性能。同样,当我们面对一个完全摸不着头绪,不知从何入手的bug时,通过调试工具来跟踪程序的执行流程往往是一个不错的选择。可见,一个好用的调试工具对于程序员来说是一件非常有帮助的利器。当下,市面上已有很多流行的代码调试工具,比如大名鼎鼎的GDB、LLDB等,它们都得到了广泛的应用并深受好评。下面,本文将介绍一种专门针对金仓数据库中的过程语言PLSQL设计的强大调试工具——plsql_pldbgapi。它可以帮助开发人员方便地调试PLSQL代码,通过调试,你可以更加自信地开发和维护金仓数据库中的PLSQL函数、存储过程等,提高开发效率和代码质量。由于调试工具plsql_pldbgapi的功能很强大,提供的调试接口很多,因此本文只介绍它的基础功能,后续会专门另写文档去讲述它的进阶用法。
plsql_pldbgapi概述
plsql_pldbgapi是KingbaseES 的一个扩展插件,它可以用于KingbaseES 中PLSQL语言的存储过程、函数、包、触发器函数、匿名块、object type方法的代码调试。plsql_pldbgapi提供了很多接口来支撑其强大的调试功能。其中包括操作断点、执行代码、调试数据、查看调用堆栈、查看源码信息、查看版本信息等。并且它还提供了局部断点调试与全局断点调试两种调试模式。本文将介绍plsql_pldbgapi的基础功能、基础功能和相关的小案例,以帮助开发人员来初步使用该工具去进行PLSQL代码的调试。
plsql_pldbgapi的基础用法
在本小节中,我们以存储过程的调试为例,来说明plsql_pldbgapi的基础功能。假设我们已经创建好了一个存储过程debug_proc, 现在我们想要使用插件plsql_pldbgapi来调试该存储过程。
当我们使用GDB去调试一个运行中的进程时,一般需要两个会话窗口去进行,其中一个显示被调试进程的执行信息(下文中用“应用端”表示),另一个用来调用GDB去写一些调试的命令(下文中用“调试端”表示)。跟GDB类似,使用plsql_pldbgapi来调试一个正在运行中的存储过程时,也需要两个会话窗口:应用端和调试端。首先我们可以在KingbaseES中使用ksql工具来开启两个会话窗口,任选一个作为应用端,另一个作为调试端。下面演示具体的调试步骤:
1>创建plsql_pldbgapi环境;
- 从系统表sys_proc中查出存储过程debug_proc的OID;(这些信息都是全局的,因此以上两个步骤在应用端和调试端执行都可以。)
- 应用端:根据查询出的OID来创建存储过程debug_proc的监听状态;
- 应用端:调用存储过程debug_proc, 会产生一个PLDBGBREAK端口号来跟这个被调用的存储过程debug_proc相关联,此处PLDBGBREAK端口号为4,此时应用端的程序会卡在此处,等待调试端来调试。
- 调试端:调用函数plsql_pldbg_attach_to_port来根据应用端产生的PLDBGBREAK端口号连接给定的监听端口,从而形成调试客户端,启动调试过程。该函数会返回一个标识此特定调试的会话句柄session_id(下图中的1), 在之后的调试动作中,可以通过此session_id来操作这个特定调试。此步骤完成后,调试存储过程debug_proc的准备工作已经完成,下面可以使用plsql_pldbgapi提供的各种功能来进行具体的调试。具体的功能会在下一小节中介绍。
Session_id
- 调试端:当调试结束后,通过在调试端调用plsql_pldbg_abort_target函数(需传入参数session_id)可以终止调试,此时应用端也会终止程序的运行,并报告一个ERROR。
调试端
应用端
plsql_pldbgapi的基础功能
plsql_pldbgapi通过接口函数来支撑它的所有调试功能,下面将通过介绍主要的接口函数来说明它的基础调试功能。
- plsql_pldbg_set_breakpoint :
该函数在调试对象的指定位置设置断点,然后等待下一个可执行语句到达该目标断点。类似于GDB中的“b”指令,它根据源代码中的行号为来设置断点,它的调用方法如下:
select plsql_pldbg_set_breakpoint(session_id, f_oid, line_no);
其中session_id是plsql_pldbg_attach_to_port函数返回的会话句柄,f_oid是欲调试的PLSQL对象的OID,line_no表示该断点设置在源代码中的第line_no行。
- plsql_pldbg_get_breakpoints:
该函数用来获取某个session_id下设置的所有断点信息,类似于GDB中的“info b”命令。它的调用方法如下:
select plsql_pldbg_get_breakpoints(session_id);
- plsql_pldbg_step_into:
该函数用来单步执行,遇到子函数或子存储过程会进入到相应的部分,类似于GDB中的“s”命令。它的调用方法如下:
select plsql_pldbg_step_into(session_id);
- plsql_pldbg_step_over:
该函数用来单步执行,不过遇见子函数或子存储过程会跳过内部的执行过程, 类似于GDB中的“n”命令。它的调用方法如下:
select plsql_pldbg_step_over(session_id);
- plsql_pldbg_continue:
该函数表示从当前位置继续执行,直到遇见下一个断点,如果没有断点,将直接执行到调试对象的最后。类似于GDB中的“c”命令。它的调用方法如下:
select plsql_pldbg_continue(session_id);
使用plsql_pldbgapi调试的小案例
在第2小节中,我们已经做好了调试存储过程debug_proc的准备工作,下面来根据上述的功能做具体的调试工作。并通过这个案例来展示plsql_pldbgapi的基础功能和用法。
- 通过函数plsql_pldbg_get_source来查看debug_proc的源码,在该函数中需要传递两个参数,一个是标识此特定调试的会话句柄session_id(下图中的1);另一个是debug_proc的OID(下图中的33073)。
应用端
调试端
- 在第5行设置断点。
调试端
应用端
- 单步执行,遇到子程序跳过。
调试端
应用端
在单步执行过程中,发现应用端报错,“ i ”不存在,对源代码修改以后继续调试。
- 查看修改后的源码
应用端
调试端
- 继续在第5行设置断点,然后单步执行
应用端
调试端
调试端
应用端
这次程序能够正常执行,说明代码修改成功。
注:本文只是介绍了调试工具plsql_pldbgapi的最基础用法,关于plsql_pldbgapi更详细和全面的使用方法可以参考KingbaseES的官方手册。