Debugging, Tracing und Logging
Transcription
Debugging, Tracing und Logging
10. Debugging, Tracing, Logging Advanced Programming Techniques Prof. Dr. Bernhard Humm FB Informatik, Hochschule Darmstadt Sommersemester 2011 1 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Einordnung in den gesamten Kurs 1. Einführung 2. Programmieren gegen Schnittstellen 3. Dokumentieren und Testen 4. Software-Kategorien 5. Komponenten 6. Referenzarchitektur Betriebliche Informationssysteme 7. Regeln für das Design von Komponenten 8. Fehlerbehandlung 9. Design Patterns 10. Debugging, Tracing, Logging 11. Konfigurationsmanagement 12. Funktionale Programmierung: Scala 13. Refactoring 2 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Agenda • Übersicht • Debugging • Tracing, Logging • Threads 3 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Debugging, Tracing und Logging: unterschiedliche Ziele und Werkzeuge Ziel Warum? Fehlersuche Wann? Während der Entwicklung Wer? Entwickler Warum? Fachliche / technische Nachvollziehbarkeit; positiv + negativ Wann? Während der Produktion Wer? Fachbereich / Wartungsteam 4 Konzept Werkzeuge Debugging Debugger in der IDE, z.B. NetBeans Tracing JDK Logging (java.util.logging.*) http://download.oracle.com/ja vase/1.4.2/docs/guide/util/log ging/overview.html Apache log4J (http://logging.apache.org/log 4j) Logging Apache Commons Logging http://commons.apache.org/l ogging/ Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Agenda • Übersicht • Debugging • Tracing, Logging • Threads 5 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Debugging mit der NetBeans IDE Step Modus Schritte: Call Stack Line Breakpoint Variablenwerte 1. Verortung des Fehlers (Line- / Exception Breakpoints, Step Modus) 2. Analyse des Fehlers (Call Stack und Variables) 3. Behebung des Fehlers (Editor) 6 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Agenda • Übersicht • Debugging • Tracing, Logging • Threads 7 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Logging mit dem JDK • Einfache Nutzung über ein globales Logger Objekt: Logger.getAnonymousLogger().info("log me"); • Angemessene Nutzung der Logging Funktionalität: Logger logger = Logger.getLogger("current.package"); logger.info("log me"); • Format einer Log-Meldung: Dec 19, 2001 2:41:13 PM MyProgram main INFO: log me • Logging kann ohne zu kompilieren an- und abgeschaltet werden. 8 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Logging-Stufen • SEVERE Desaströse Fehler, die einer sofortigen Behandlung bedürfen. Der Betrieb kann nicht mehr vollständig gewährleistet werden. • WARNING Schwerwiegende Probleme, die einer gesonderten Ausnahmebehandlung bedürfen. • INFO Der Default-Level, in dem alle fachlichen Protokollierungen vorgenommen werden • CONFIG Protokollierung der Konfigurationseinstellungen. • FINE, FINER, FINEST Detaillierte Informationen zum Tracen eines Programms. 9 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Infrastruktur des Logging–Systems Quelle: http://download.oracle.com/javase/1.4.2/docs/guide/util/logging/overview.html • Um eine Meldung zu protokollieren, wird ein Logger-Objekt benötigt. • Logger-Objekt wird von der Factory-Methode Logger.getLogger("package name") bereitgestellt • Jedem Logger können beliebig viele Handler zugewiesen werden. 10 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Infrastruktur des Logging–Systems (Forts.) • Ein Formatter wird von einem Handler zur Formatierung der Meldung verwendet. • Im java.util.logging-Paket werden ein SimpleFormatter und ein XMLFormatter bereitgestellt. • Ein Filter kann auf beliebige Meldungen angewendet werden. • Filter können sowohl einem Handler als auch einem Logger zugewiesen werden. 11 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Konfiguration des Logging–Systems • Alle Logger werden im Kontext eines LogManagers definiert. • Es gibt eine systemweite Konfiguration. • Der Default-LogManager liest seine Einstellung aus der Datei jre/lib/logging.properties. • Zusätzliche Konfigurationen bieten eine größere Kontrolle. • Der Default-LogManager kann mit readConfiguration() reinitialisiert werden. • LogLevel werden eingestellt auf - Handler – Ebene - Package – Ebene • Level-Analyse „in Serie“. 12 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Konfiguration des Logging–Systems (Forts.) • Ein ErrorManager kümmert sich um Fehler, die der Logger verursacht • Logging-Fehler sind für die Anwendung nicht relevant. • Der ErrorManager meldet nur den ersten Fehler. • Der ErrorManager kann spezialisiert werden. 13 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 Agenda • Übersicht • Debugging • Tracing, Logging • Threads 14 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 java.lang.Thread • Implementierung: class PrimeThread extends Thread { long minPrime; PrimeThread(long minPrime) { this.minPrime = minPrime; } public void run() { // compute primes larger than minPrime . . . } } • Nutzung PrimeThread p = new PrimeThread(143); p.start(); Quelle: http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Thread.html 15 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 java.util.concurrent. BlockingQueue<E> • Implementierung: class Producer implements Runnable { private final BlockingQueue queue; Producer(BlockingQueue q) { queue = q; } public void run() { try { while(true) { queue.put(produce()); } } catch (InterruptedException ex) { ... handle ...} } Object produce() { ... } } class Consumer implements Runnable { private final BlockingQueue queue; Consumer(BlockingQueue q) { queue = q; } public void run() { try { while(true) { consume(queue.take()); } } catch (InterruptedException ex) { ... handle ...} } void consume(Object x) { ... } } Quelle: http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/BlockingQueue.html 16 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011 java.util.concurrent. BlockingQueue<E> (Forts.) • Nutzung: class Setup { void main() { BlockingQueue q = new SomeQueueImplementation(); Producer p = new Producer(q); Consumer c1 = new Consumer(q); Consumer c2 = new Consumer(q); new Thread(p).start(); new Thread(c1).start(); new Thread(c2).start(); } } Quelle: http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/BlockingQueue.html 17 Prof. Dr. Bernhard Humm, FB Informatik, Hochschule Darmstadt. www.fbi.h-da.de/~b.humm. Sommersemester 2011