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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论
- ATTACH