
在达梦数据库中,我们可以利用DM PL/SQL进行存储过程及函数的编写。有时,我们编写的程序块中可能会有BUG导致编译失败,这种情况下就需要用到相关工具来进行调试。在有图形化界面的情况下,我们可以利用管理工具来进行匿名块的调试。

但是当我们没有图形界面,或者通过远程连接服务器的时候,我们也可以利用达梦提供的命令行调试工具dmdbg,来完成同样的任务。dmdbg跟disql同级目录,都在dmdbms/bin目录下,登录方式同disql:
[root@localhost bin]# ./dmdbg SYSDBA:5236
dmdbg V7.6.0.96-Build(2018.09.19-97292)ENT
login time used:6.918(ms)
服务器[LOCALHOST:5236]:处于普通打开状态
DBG>
输入help我们可以看到他提供的功能和对应按键:

这里只截取了其中一部分,其中用的比较多的是其中的SQL ,B,R,N,S等。
注意,2018年中往后的版本需要开启debug的包
位置如下:

下面我们构造一段有问题的代码,并演示如何分步调试
代码如下:
/*当tt到3的时候就会报除0错误*/
create or replace procedure TEST_DMDBG
as
aa int;
begin
for i in 1..3
loop
aa = 1 (3-i);
print aa;
end loop;
end;
如果执行call TEST_DMDBG,系统就会报错,因此我们将call TEST_DMDBG;作为我们调试的语句
创建完成后,我们登录到dmdbg中,然后把call TEST_DMDBG;放到sql里
DBG> sql call TEST_DMDBG;
DBG>
然后我们添加断点,由于我的习惯一般是从头开始调试,因此会将断点放到最开始的位置,大家可以在需要的行数打上断点。
DBG> B 0
Breakpoint 1 at @dbg_main, line: 1@{call TEST_DMDBG;}
接下来我们输入r,开始debug
DBG> r
Breakpoint 1, line: 1@{call TEST_DMDBG;}
输入s,进入到循环里调试
DBG> s
SYSDBA.TEST_DMDBG line: 5 @{ for i in 1..3}
DBG> s
SYSDBA.TEST_DMDBG line: 7 @{ aa = 1 (3-i);}
输入bt,可以查看当前的堆栈
DBG> bt
#0 SYSDBA.TEST_DMDBG() line: 7@{ aa = 1 (3-i);}
#1 @dbg_main line: 1@{call TEST_DMDBG;}
如果我们想要查看当前变量的数值,可以通过P 变量名的方式输出打印
DBG> p aa
$3 = 0
至此,问题可以看出是由于i=3时出现了除0的错误,我们就可以开始修改程序





