暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T DBMS_DEBUG

墨天轮 2019-10-12
1002

DBMS_DEBUG

功能描述

用于对存储过程(含自定义函数,触发器)的运行过程调试。

说明:
  • 调试过程需要用户通过客户端与服务器开启两个链接(即建立两个session)。
  • 在客户端中将一个session通过运行dbms_debug.init切换为target session。
  • 在客户端中将另一个session通过运行dbms_debug.attach切换为debug session。
  • target session执行需要被调试的程序(程序指存储过程,自定义函数,触发器)。
  • debug session控制程序运行状态,获取程序的堆栈信息,变量信息等。
  • debug session不同的角色权限,调试功能有所差异:
    • dba角色权限的用户:可以连接其他用户建立的target session,调试其他用户的程序。
    • 非dba角色用户:只能连接自己建立的target session,调试自己创建的程序。
    • 非dba角色用户:调试的程序嵌套其他用户的程序时,如果target session用户被赋予了针对嵌套程序的execute权限,则target session中被调试的程序可以正常调用嵌套程序,但会跳过嵌套程序的调试(例如单步进入该程序,在该程序中设置断点)。

接口介绍

  • INIT

    描述

    将普通session初始化为target session。运行条件是normal session。

    接口:

    DBMS_DEBUG.INIT( time IN INTEGER );

    参数:

    time:设置调试阶段最大等待时间,每次存储过程执行暂停时开始计时,单位0.1s。

    返回值:

    INTEGER类型,被初始化为target session的session id。

    示例:

    select dbms_debug.init(10000) from SYS_DUMMY; DBMS_DEBUG.INIT(10000) ---------------------- 64
  • ATTACH

    描述

    连接target session,当前session调整为debug session。运行条件是normal session。

    接口:

    DBMS_DEBUG.ATTACH( id      IN INTEGER, num     IN INTEGER );

    参数:

    id:设置需要连接的target session的id,可以从dbms_debug.init返回值获取。

    num:设置调试时最大可支持断点个数。

    返回值:

    NA。

    示例:

    call dbms_debug.attach(64, 10);
  • DETACH

    描述

    与target session断开连接,当前session调整为普通session。运行条件是debug session,且被调试程序为IDLE或者WAITING状态。

    接口:

    DBMS_DEBUG.DETACH( terminate   IN INTEGER );

    参数:

    terminate:设置断开连接后target session中的程序运行机制,0表示继续运行到程序结束;1表示终止当前程序。

    返回值:

    NA。

    示例:

    call dbms_debug.detach(0);
  • RESUME

    描述

    让暂停的存储过程继续运行,并响应break标志,详见flag说明。运行条件是debug session,且被调试程序为WAITING状态。

    接口:

    DBMS_DEBUG.RESUME( flag    IN INTEGER, time    IN INTEGER );

    参数:

  • flag:设置继续运行的标志。
  • BRK_NEXT_LINE(0):运行到下一物理行后暂停,如果当前行有嵌套程序,跳过嵌套程序。
  • BRK_ANY_CALL(1):运行到下一逻辑行后暂停,如果当前行有嵌套程序,进入嵌套程序。
  • BRK_ANY_RETURN(2):运行到当前调用栈程序的结束行后暂停,忽略运行过程中嵌套程序的结束行。
  • BRK_RETURN(3):运行到最近一个结束行后暂停,含嵌套程序的结束行。
  • BRK_EXCEPTION(4):程序出现异常后暂停。
  • BRK_HANDLER(5):程序出现异常并捕获,异常处理流程完成后暂停。
  • BRK_ABORT(6):程序立即终止。
  • BRK_NEVER(7):程序不暂停,除非设置断点匹配。
  • time:设置最大等待时长,单位0.1s。如果设置为0,表示不等待target session暂停;如果设置大于0,则等待target session暂停

    返回值:

    NA。

    示例:

    call dbms_debug.resume(0, 100);
  • PAUSE

    描述

    强制暂停正在运行的存储过程。运行条件是debug session,且被调试程序为EXECUTING状态。

    接口:

    DBMS_DEBUG.PAUSE();

    参数:

    NA。

    返回值:

    NA。

    示例:

    call dbms_debug.pause();
  • TERMINATE

    描述

    强制终止正在运行的存储过程,被终止的存储过程会报错退出。运行条件是debug session,且被调试程序为EXECUTING状态。

    接口:

    DBMS_DEBUG.TERMINATE();

    参数:

    NA。

    返回值:

    NA。

    示例:

    call dbms_debug.terminate();
  • SET_CURR_COUNT

    描述

    设置target session等待计数,如果长时间暂停存储过程运行,可通过该函数清理计数,防止等待超时。运行条件是debug session。

    接口:

    DBMS_DEBUG.SET_CURR_COUNT( count    IN INTEGER );

    参数:

    count:设置target session等待计数。

    返回值:

    NA。

    示例:

    call dbms_debug.set_curr_count(0);
  • GET_STATUS

    描述

    查询当前target session的运行状态。运行条件是debug session。

    接口:

    DBMS_DEBUG.GET_STATUS();

    参数:

    NA。

    返回值:

    INTEGER类型,DBG_IDLE= 0;DBG_EXECUTING= 1;DBG_WAITING= 2;DBG_PRE_WAIT = 3。

    示例:

    select dbms_debug.get_status() from SYS_DUMMY; DBMS_DEBUG.GET_STATUS() ----------------------- 2
  • GET_VALUE

    描述

    查询指定变量值。运行条件是debug session,且被调试程序为WAITING状态。

    接口:

    DBMS_DEBUG.GET_VALUE( stack_id IN INTEGER, vid_block   IN INTEGER, vid_id IN INTEGER, vid_offset IN INTEGER );

    参数:

    stack_id:调用栈编号,如果编号为0,或者大于当前最大调用栈深度,则按当前最大调用栈编号查询。

    vid_block:程序中语句块编号。

    vid_id:语句块中变量编号。

    vid_offset:record属性偏移量,仅record类型有效。

    返回值:

    STRING类型,字符串形式展现变量值。

    示例:

    select dbms_debug.get_value(1,0,0,0) from SYS_DUMMY; DBMS_DEBUG.GET_VALUE(1,0,0,0) ----------------------------- 1
  • SET_VALUE

    描述

    设置指定变量值。运行条件是debug session,且被调试程序为WAITING状态。

    接口:

    DBMS_DEBUG.SET_VALUE( stack_id IN INTEGER, vid_block   IN INTEGER, vid_id IN INTEGER, vid_offset IN INTEGER, value IN STRING );

    参数:

    stack_id:调用栈编号,如果编号为0,或者大于当前最大调用栈深度,则按当前最大调用栈编号查询。

    vid_block:程序中语句块编号。

    vid_id:语句块中变量编号。

    vid_offset:record属性偏移量,仅record类型有效。

    value:设置变量值。

    返回值:

    NA。

    示例:

    call dbms_debug.set_value(2,0,1,1,'2');
  • ADD_BREAK

    描述

    添加断点。运行条件是debug session。

    注意:

    自定义函数和存储过程的程序入口是首个begin语句后一行(即跳过首个begin行的执行),匿名块和触发器的程序入口是首个begin语句。

    continue语句如果存在label,会跳过label语句,直接执行label语句下面的循环语句。

    while语句,for语句具备跳出循环的条件时,不会执行end loop语句。

    自定义函数和存储过程首个begin语句不可以设置断点。

    异常处理语句中,when then语句不可以设置断点。

    接口:

    DBMS_DEBUG.ADD_BREAK( owner IN STRING, obj_name    IN STRING, line IN INTEGER, skip_times IN INTEGER, cond IN STRING );

    参数:

    owner:需要设置断点的对象对应的用户。

    obj_name:需要设置断点的对象。

    line:需要设置断点的对象的物理行号。

    skip_times:断点最大忽略次数。

    cond:断点触发条件(预留参数,建议传空字符串)。

    返回值:

    INTEGER类型,断点编号,从1开始计数。

    示例:

    select dbms_debug.add_break('sys','TEST_BREAK_LV3_FUNC1',4,0,'') from SYS_DUMMY; DBMS_DEBUG.ADD_BREAK('SYS','TEST_BREAK_LV3_FUNC1',4,0,'') ----------------------------------------------------------- 1
  • DELETE_BREAK

    描述

    删除断点。运行条件是debug session,且被调试程序为IDLE or WAITING状态。

    接口:

    DBMS_DEBUG.DELETE_BREAK( break_id IN INTEGER );

    参数:

    break_id:断点编号,从1开始计数。如果参数为0,删除全部断点。

    返回值:

    NA。

    示例:

    call dbms_debug.delete_break(5);
  • DELETE_BREAK_BY_NAME

    描述

    删除指定对象中的所有断点。运行条件是debug session,且被调试程序为IDLE or WAITING状态。

    接口:

    DBMS_DEBUG.DELETE_BREAK_BY_NAME(    owner IN STRING, obj_name    IN STRING );

    参数:

    owner:需要删除断点的对象对应的用户。

    obj_name:需要删除断点的对象。

    返回值:

    NA。

    示例:

    call dbms_debug.delete_break_by_name('SYS','SET_DELETE_BREAK_PROC');
  • SET_BREAK

    描述

    设置断点禁止或者使能。运行条件是debug session,且被调试程序为IDLE or WAITING状态。

    接口:

    DBMS_DEBUG.SET_BREAK( break_id IN INTEGER,    enable    IN INTEGER );

    参数:

    break_id:断点编号,从1开始计数。

    enable:0为禁止,1为使能。

    返回值:

    NA。

    示例:

    call dbms_debug.set_break(9, 0);
  • UPDATE_BREAK

    描述

    更新断点最大忽略次数。运行条件是debug session,且被调试程序为IDLE or WAITING状态。

    接口:

    DBMS_DEBUG.UPDATE_BREAK( break_id IN INTEGER,    skip_times IN INTEGER );

    参数:

    break_id:断点编号,从1开始计数。

    skip_times:断点最大忽略次数。

    返回值:

    NA。

    示例:

    call dbms_debug.update_break(2, 4);
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论