当前位置: 首页 > postgresql > 正文

Pldebugger 原理分析

PLdebugger是用来对plsql进行调试的工具,架构设计上可以支持多中语言,但是目前只实现了对plsql的调式。

PLdebugger的结构如下图所示:

debugger

运行时有三个部件:client、target、和proxy。

client:

client是用户使用debugger的接口,它通过libpq连接到proxy上。client和proxy之间使用sql语句进行交互(确切的说是一组API函数),client可以是任意的能使用libpq的工具,如psql、pgagmin等

Proxy:

运行在后台的process,提供一组api函数供target和client之间通信。

Target:

运行在后台的process,用来执行需要调式的plsql存储过程或者函数,接受来自proxy转送过来的命令,返回结果等

pldebugger的执行流程如下:

    1. 使用plpgsql_oid_debug在需要调试的函数开头加一个断点。
    2. 使用恰当的参数运行需要调试的函数(call或者select)。
    3. 后台target开始运行,通过notce发出target的BackendID。
    4. 使用pldbg_attach_to_port让proxy链接到target。
    5. 使用pldbg_wait_for_breakpoint获取target目前所在的函数OID、行号等信息。

至此,debugger已经开始工作了。在debug的过程中,可以通过一组API(c函数)进行丰富的操作,比如:设置/清除断点、StepIN、StepOver、切换stack、查看/设置变量值等。主要的API如下:

    Pldbg_abort_target                  中断target的运行
    Pldbg_continue 让target             运行到下一个断点
    Pldbg_get_variables                 获取变量的当前值
    Pldbg_deposit_value                 设置变量的当前值
    Pldbg_drop_breakpoint               删除断点
    Pldbg_get_breakpoints               获取断点列表
    Pldbg_set_breakpoint                设置断点
    Pldbg_get_source                    获取plsql的源代码
    Pldbg_get_stack                     获取stack列表
    Pldbg_step_into                     跳入
    Pldbg_step_over                     跳过

核心原理:

    1. pldebugger使用外部扩展(C函数)的方式加载进入 postgresql 数据库
    2. postgresql在启动的时候,会自动调用pldebugger 的 _PG_init
    3. 在 _PG_init 中,pldebugger 将 PLpgSQL_plugin 中的核心函数替成自行实现的函数
      (比如:将 error_callback 替换成了 dbg_newstmt)
    4. dbg_newstmt 会在每条 plsql 语句执行完后回调
    5. 在 dbg_newstmt 中, pldebugger 检查目前是不是处在相应的 breakpoint处
    5a.如果是,停下来接受来自用户的命令(设置/清除断点、StepIN、StepOver、切换stack、查看/设置变量值等)
    5b.如果不是,继续执行下一条语句
    6. 回到第四步一直循环至 plsq 执行完成
    分享到:

本文固定链接: http://klwang.info/pldebugger-analyse/ | 数据库|Linux|软件开发

该日志由 klwang 于2014年08月14日发表在 postgresql 分类下, 你可以发表评论,并在保留原文地址及作者的情况下引用到你的网站或博客。
原创文章转载请注明: Pldebugger 原理分析 | 数据库|Linux|软件开发

Pldebugger 原理分析:等您坐沙发呢!

发表评论

*
快捷键:Ctrl+Enter