Benutzer-Werkzeuge

Webseiten-Werkzeuge


prog:plsql_debug

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
prog:plsql_debug [2016/02/23 21:14]
gpipperr [Break Point kann nicht gesetzt werden, da Code nicht vorliegt, anonyme Prozedur]
prog:plsql_debug [2016/02/23 22:38] (aktuell)
gpipperr [Netz Probleme]
Zeile 1: Zeile 1:
 +====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:
 +<code sql>
 +sqlplus / as sysdba
 +
 +grant DEBUG CONNECT SESSION to gpi;
 +grant DEBUG ANY PROCEDURE to gpi;
 +
 +
 +</code>
 +
 +**Oracle 12c** Netzwerk ACL setzen!
 +<fc #800000>Fehler:</fc>
 +<code sql>
 +ORA-24247: Netzwerkzugriff von Access Control-Liste (ACL) abgelehnt
 +ORA-06512: in "SYS.DBMS_DEBUG_JDWP", Zeile 68
 +ORA-06512: in Zeile 1
 +</code>
 +
 +<code sql>
 +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;
 +/
 +</code>
 +
 +----
 +
 +===Aufruf des Debuggers===
 +
 +PL/SQL Code über das Debugging übersetzen, in der Oberfläche mit dem Zahnrad mit dem "Käfer"
 +
 +{{:prog:plsql:sql_developer_debug_v01.png|PL/SQL zum Debuggen übersetzen}}
 +
 +
 +Eine Break Point über den linken Rand des Editors setzen
 +
 +{{:prog:plsql:sql_developer_debug_v02.png|PL/SQL zum Debuggen Breakpoint setzen}}
 +
 +
 +
 +"Käfer" Symbol im geöffneten PL/SQL Editor zum Starten des Debuggers verwenden.
 +
 +{{:prog:plsql:sql_developer_debug_v03.png|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:
 +<code sql>
 +
 +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')
 +/
 +</code>
 +
 +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"
 +  * {{:prog:plsql:sql_developer_debug_v05.png| 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:
 +  * {{:prog:plsql:sql_developer_debug_v04.png|PL/SQL Debugger auf einer IP Adresse und einem Port starten}}
 +
 +
 +In SQL Plus die Debug Connection zu dem obigen Listener aktivieren:
 +<code sql>
 +
 +-- Debug Session auf einen Port starten, z.B. 4444
 +
 +begin
 +  DBMS_DEBUG_JDWP.CONNECT_TCP( '127.0.0.1', '4444' );
 +end;
 +/
 +
 +</code>
 +
 +Der Datenbank Core verbindet sich mit dem Debugger Listener auf dem Client PC:
 +
 +{{:prog:plsql:sql_developer_debug_v06.png| 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
 +<code sql>
 +create or replace procedure my_debugSession
 +is
 +begin
 + null;
 +end;
 +/
 +</code>
 +
 +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.
 +
 +<code sql>
 +-- 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;
 +/
 +</code>
 +
 +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:
 +
 +<code>
 +PL/SQL wird ausgeführt: CALL DBMS_DEBUG_JDWP.CONNECT_TCP( 'srvdbgpi01', '5555' )
 +</code>
 +
 +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:
 +<code sql>
 +select dbms_debug_jdwp.current_session_id sid
 +     , dbms_debug_jdwp.current_session_serial serial
 +from dual
 +/
 +</code>
 +geht aber auch über sys_context('userenv','SID').
 +
 +
 +==== Quellen ====
 +
 +
 +Oracle:
 +  * http://docs.oracle.com/html/B31355_01/external_app_debug_mode.htm
 +
 +Im Netz:
 +
 +  * https://galobalda.wordpress.com/2014/02/17/sql-developers-plsql-debugger-and-oracle-12c/
 +  * http://barrymcgillin.blogspot.de/2012/04/remote-debugging-with-sql-developer.html
 +  * http://www.thatjeffsmith.com/archive/2012/05/using-sql-developer-to-debug-your-anonymous-plsql-blocks/
 +  * http://stackoverflow.com/questions/12465067/debugging-in-sqldeveloper-over-ssh-tunnel    
 +  * http://ttlnews.blogspot.com/2012/10/how-to-remote-debug-plsql-with-oracle.html
  
"Autor: Gunther Pipperr"
prog/plsql_debug.txt · Zuletzt geändert: 2016/02/23 22:38 von gpipperr