远程调试 PL/SQL 包

Posted

技术标签:

【中文标题】远程调试 PL/SQL 包【英文标题】:Remote debug PL/SQL packages 【发布时间】:2017-12-28 14:18:31 【问题描述】:

假设我有一个正在运行的 java web 应用程序,我正在尝试保存一些数据,使用 JDBC 调用数据库中的 PL/SQL 包。

在java代码中,调用了execute()函数,将要保存的数据发送到数据库中的PL/SQL包中,由PL/SQL包处理数据并最终保存。

有没有办法使用 Oracle SQL Developer 或 PL/SQL Developer 即时调试调用的 PL/SQL 包,这些 IDE 是否支持这种远程调试功能?

【问题讨论】:

“调试数据库”是什么意思?我不熟悉这个概念。 PL/SQL 的交互式调试是可能的,但前提是我们事先做好了准备。尤其是因为它需要授予某些特权。请阅读this blog by @thatjeffsmith which is a top-notch overview of the steps involved @mathguy thx,匆忙写下,现已更正 @APC 谢谢,我会检查一下,希望这也适用于对过程的 JDBC 调用 我反对将其关闭为“过于宽泛”。远程调试是尽可能多的主题编程,虽然可能有不止一种选择,但它不像是一堆选项的浪费。询问“我需要为正在开发的在线购物应用程序保存一些数据,我该怎么做?”是一个过于宽泛的问题。这个不是。 【参考方案1】:

您正在寻找的是 Oracle SQL Developer 中提供的 远程调试 功能。 有几个先决条件需要满足:

    您要调试的所有软件包都应为调试而编译alter package SCHEMA.PACKAGE_NAME compile debug; 应授予要从其执行远程调试的架构的用户适当的权限: grant debug connect session to USER_NAME; 用于连接到远程用户的会话 grant debug any procedure to USER_NAME; 用于调试程序(包括捆绑在包中的程序) 如果你使用 Oracle 12c,你应该考虑额外的 ACL 限制,看看 here 和 here,还注意有一些有用的 Oracle 视图,比如 dba_network_acl_privileges 来检查你现有的 ACL 权限李> 远程用户应该能够为调试器“发出信号” grant execute on SYS.DBMS_DEBUG_JDWP to REMOTE_USER_NAME; 可以访问其CONNECT_TCP 程序

如果满足这些要求(或者您能够满足这些要求),您可以遵循例如this entry 在 Sue Harper 的博客中(或 this article 在同一作者的 Oracle 博客中,或 this one)以实现您的目标。简而言之:

    您应该在特定端口上本地启动调试侦听器并设置断点(或设置适当的调试器选项)。 远程用户应该在运行感兴趣的代码之前运行exec DBMS_DEBUG_JDWP.CONNECT_TCP( 'ip-address', port ),这可以在会话登录触发器上实现。 远程调试您的代码。

对此可能有一些更具体的内容(对于 Oracle,这不仅仅是真实的),但这是我通常处理它的方式。

我还想提一下,不幸的是 PL/SQL Developer does not support 远程调试(使用 DBMS_DEBUG 包而不是 DBMS_DEBUG_JDWP),即使在最新版本中也是如此。 Oracle SQL Developer 是用 Java 编写的,PL/SQL Developer 不是,我认为这是问题的根源。

【讨论】:

以上是关于远程调试 PL/SQL 包的主要内容,如果未能解决你的问题,请参考以下文章

IDEA Intellij 如何调试从 Java 类调用的 PL/SQL 代码

远程调试weinre的使用

weblogic远程调试XMLDecoder RCE

调试Idea如何远程debug之SpringBoot jar包启动

每人一个远程 Fiddler,抹平各端调试差异 — Nohost

[Java代码审计]——远程调试初探