断点不生效需先排查四件事:目标对象未添加调试信息、登录账号缺少DEBUG CONNECT SESSION等权限、Test Window调用的非最新编译版本、断点设在不可达的非执行语句上。

断点设了但根本不停,先查这四件事
断点不生效不是工具坏了,而是调试链路上某个环节断了。最常卡在以下四个地方:
- 目标对象没加调试信息:
ADD DEBUG INFORMATION没执行过,或者别人重新编译覆盖掉了——必须右键 Procedure/Function/Package Body →Add debug information,再重新编译一次 - 登录账号缺权限:
ORA-0131: insufficient privileges就是缺DEBUG CONNECT SESSION;某些环境还要DEBUG ANY PROCEDURE,用SELECT * FROM SESSION_PRIVS看当前会话有没有这两项 - Test Window 调用的不是最新版本:改完代码后没点
Compile,或者编译失败却没注意提示,Test Window 里跑的还是旧版字节码 - 断点位置不可达:比如放在
EXCEPTION块里,但异常根本没抛;或放在IF FALSE THEN分支里;甚至只是空行、注释行——断点必须落在可执行语句上,且该语句实际会被运行到
PL/SQL Developer 里怎么启动真调试(不是普通执行)
从 Object Browser 找到过程 → 右键 → Test,只是打开测试窗口,**不等于进入调试模式**。关键动作是:
- 填完所有输入参数后,**不要点绿色“执行”按钮**(那个只运行,不停断点)
- 点菜单栏
Debugger → Start Debugger,或直接按F9 - 如果没反应,检查左下角状态栏是否显示
Debugging...;没有就说明没真正启动调试器 - 首次调试前,确认
Tools → Preferences → Debugger里勾上了Always add debug information when compiling
SQL Developer 调试卡在“正在初始化调试会话”
这不是网络慢,是数据库端没放行调试通道。必须同时满足三件事:
- 数据库参数得开:
ALTER SYSTEM SET remote_debugger_enabled = TRUE SCOPE=BOTH(Oracle 12c+ 默认FALSE) - 客户端“首选项 → 数据库 → PL/SQL 调试器”中,“主机地址”填你本机真实 IP(比如
192.168.1.100),**不能填localhost或127.0.0.1**——因为数据库服务器要反向连回来 - 防火墙得放行调试端口(默认
4000),Windows 杀毒软件有时也会拦截JDWP连接
DBMS_OUTPUT.PUT_LINE 没输出?别怪代码
它不是“打印”,是往缓冲区写数据,客户端不主动捞就永远看不见:
- SQL*Plus / SQLcl 里必须先执行:
SET SERVEROUTPUT ON SIZE UNLIMITED(ON不够,超长输出会截断或报ORA-20000) - SQL Developer 每个 worksheet 是独立的,新开 tab 或重连后,要手动点绿色小喇叭图标启用 DBMS 输出
- 自治事务(
AUTONOMOUS_TRANSACTION)里写的PUT_LINE,父会话绝对收不到——这是设计行为,不是 bug - 调试时别等最后才刷日志,关键分支后立刻
DBMS_OUTPUT.PUT_LINE,否则过程一结束缓冲区就丢了
调试真正卡住的地方,往往不是语法或逻辑,而是权限、配置、网络这几层“看不见的依赖”。尤其是多人共用测试库时,别人一次编译就可能清掉你的调试信息,这种事每天都在发生。


















