Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:plsql_debug

PL/SQL Programme im Oracle SQL Developer 4.1 debuggen

Getestet mit v4.1 gegen 11g R2 / 12c R1

Auch in PL/SQL lässt sich recht einfach ein Programm wie in anderen Programmiersprache debuggen.

Da PL/SQL aber im Core der Datenbank läuft muss eine Remote Verbindung auf die Datenbank aufgebaut werden um diese Vorgang dort zu überwachen.

Dazu ist es aber unerlässlich, das der für das Debuggen verwendete Port im Netzwerk auch frei vom Server zum Client verfügbar ist und nicht über eine Firewall gesperrt wird.

Der Remote Debugger wird auf dem Client gestartet und die Datenbank verbindet sich zu dieser IP Adresse und diesen Port!

Vorbereitung DB

Der Datenbank User benötigt zum Debuggen entsprechende Rechte und ab 12c muss mit einer ACL auch der Netzzugriff erlaubt sein.

Rechte zum Debuggen auf dem User, die PL/SQL debuggen will, vergeben:

sqlplus / AS sysdba
 
GRANT DEBUG CONNECT SESSION TO gpi;
GRANT DEBUG ANY PROCEDURE TO gpi;

Oracle 12c Netzwerk ACL setzen! Fehler:

ORA-24247: Netzwerkzugriff von Access Control-Liste (ACL) abgelehnt
ORA-06512: IN "SYS.DBMS_DEBUG_JDWP", Zeile 68
ORA-06512: IN Zeile 1
BEGIN
 DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE
 (
 host => '10.10.10.1',
 lower_port => NULL,
 upper_port => NULL,
 ace => xs$ace_type(privilege_list => xs$name_list('jdwp'),
 principal_name => 'GPI',
 principal_type => xs_acl.ptype_db)
 );
END;
/

Aufruf des Debuggers

PL/SQL Code über das Debugging übersetzen, in der Oberfläche mit dem Zahnrad mit dem „Käfer“

PL/SQL zum Debuggen übersetzen

Eine Break Point über den linken Rand des Editors setzen

PL/SQL zum Debuggen Breakpoint setzen

„Käfer“ Symbol im geöffneten PL/SQL Editor zum Starten des Debuggers verwenden.

PL/SQL zum Debuggen starten

Verknüpfen des Debuggers mit einer SQL*Plus Session

Soll der PL/SQL Block nicht im SQL*Developer gestartet werden, sonder über SQL*Plus (zum Beispiel direkt auf dem Server) wird die laufenden Session aus SQL*Plus direkt an den Debugger in SQL Developer „gebunden“.

In SQL*Plus PL/SQL Block zum Debuggen übersetzen, im Beispiel eine Funktion:

ALTER SESSION SET PLSCOPE_SETTINGS='identifiers:all';
ALTER SESSION SET PLSQL_OPTIMIZE_LEVEL=1;
ALTER SESSION SET PLSQL_DEBUG=TRUE;
 
ALTER FUNCTION validateUser compile;
 
 
-- testen ob es geklappt hat
-- auf plsql_debug muss TRUE sein
 
SELECT 
	  owner               
	, name                
	, TYPE                
	, plsql_optimize_level
	, plsql_code_type     
	, plsql_debug			
	, plsql_warnings      
	, plsql_ccflags       
	, plscope_settings    
 FROM dba_plsql_object_settings 
WHERE NAME LIKE UPPER('validateUser')
/

Im SQL*Developer Debugger über die Connection Baum auf der rechten Seite auf einen Port wie 4444 starten:

  • Rechte MausTaste auf dem Connection Object, Aufruf über „Remote Debugging“
  •  PL/SQL Debugging Menü öffnen
  • Port und IP Adresse auf dem der Debugger „horchen“ soll (IP Adresse der Maschine oder localhost, falls auf der gleichen Maschine wie die Datenbank!), eingeben:
  • PL/SQL Debugger auf einer IP Adresse und einem Port starten

In SQL Plus die Debug Connection zu dem obigen Listener aktivieren:

-- Debug Session auf einen Port starten, z.B. 4444
 
BEGIN
  DBMS_DEBUG_JDWP.CONNECT_TCP( '127.0.0.1', '4444' );
END;
/

Der Datenbank Core verbindet sich mit dem Debugger Listener auf dem Client PC:

 PL/SQL developer wartet auf die Ausführung der Funktion

Dann die Funktion in SQL*Plus normal starten, in PL/SQL Developer hält die Verarbeitung am zuvor gesetzten Break Point im geöffneten Code in PL/SQL Developer an.

Break Point kann nicht gesetzt werden, da Code nicht vorliegt, anonyme Prozedur

Kann keine Break Point in der Routine gesetzt, werden, zum Beispiel eine anonyme PL/SQL Routine, zuvor eine Dummy Funktion im PL/SQL Developer definieren und in dieser eine „Breakpoint“ setzen und dann durch den Code steppen.

Dummy Funktion in SQL Developer anlegen und dort zum Debuggen übersetzen, dort eine Brack Point setzen

procedurein SQL*Plus anlegen

CREATE OR REPLACE PROCEDURE my_debugSession
IS
BEGIN
 NULL;
END;
/

Pl/SQL Developer starten und dort die Procedure öffnen.

Für Debug übersetzen und eine Break Point setzen.

Wie im oberen Beispiel eine SQL*Plus Debug Session initialisieren und die Procedure my_debugSession gleich zu beginn des anoynmen PL/SQL Blockes aufrufen.

-- anleitung wie oben
 
DECLARE
 v_var NUMBER;
BEGIN
 -- für den Halte Punkt die dummy Procedure aufrufen
 my_debugSession;
 -- Hier startet der eigentliche Code
 --
END;
/

Der Debugger im SQL Developer springt damit an, und des kann über den gesamten Code gesteppt werden!


Probleme

Netz Probleme

Die Netzwerk Verbindung muss von Server zum Client für den Port, der in der Log Ausgaben, angezeigt wird auch durch die Firewall funktionieren!

Beispiel Ausgabe:

PL/SQL wird ausgeführt: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( 'srvdbgpi01', '5555' )

Dann muss auch nun ein Zugriff auf den Port 5555 und die IP Adresse srvdbgpi01 erlaubt sein!


DAs dbms_debug_jdwp Package

SID und Serial ohne Rechte auf die V$Session auswerten:

SELECT dbms_debug_jdwp.current_session_id sid
     , dbms_debug_jdwp.current_session_serial serial
FROM dual
/

geht aber auch über sys_context('userenv','SID').

Quellen

Cookies helfen bei der Bereitstellung von Inhalten. Durch die Nutzung dieser Seiten erklären Sie sich damit einverstanden, dass Cookies auf Ihrem Rechner gespeichert werden. Weitere Information
"Autor: Gunther Pipperr"
prog/plsql_debug.txt · Zuletzt geändert: 2016/02/23 22:38 von Gunther Pippèrr