open source debugging for java 1.4.0

152
by Matthew McCullough of Ambient Ideas, LLC Java Debugging Tools Open Source

Upload: matthew-mccullough

Post on 11-May-2015

3.774 views

Category:

Education


2 download

DESCRIPTION

Open Source Debugging for Java given at the Dallas MUG

TRANSCRIPT

Page 1: Open Source Debugging for Java 1.4.0

by Matthew McCullough of Ambient Ideas, LLC

Java Debugging Tools

Open Source

Page 2: Open Source Debugging for Java 1.4.0

Code Examples http://github.com/matthewmccullough

Twitter

@matthewmccull

Email

[email protected]

Blog

http://www.ambientideas.com/blog sidebar has my social networking profile links

Page 3: Open Source Debugging for Java 1.4.0

http://delicious.com/matthew.mccullough/opensource+debugging

Page 4: Open Source Debugging for Java 1.4.0

Not

Page 5: Open Source Debugging for Java 1.4.0

Instead

Page 6: Open Source Debugging for Java 1.4.0
Page 7: Open Source Debugging for Java 1.4.0

VisualVM

Eclipse MAT

jstack

jhatjmap

jstat

jstatdTOD

TPTP

jps

Page 8: Open Source Debugging for Java 1.4.0

Hotspot JVMs

Page 9: Open Source Debugging for Java 1.4.0

jps process list

Page 10: Open Source Debugging for Java 1.4.0

What JVM options did we use when we started up the app

server?

Page 11: Open Source Debugging for Java 1.4.0

jps

Page 12: Open Source Debugging for Java 1.4.0

jps -l

◀Sho

w fu

ll pac

kage n

ame

Page 13: Open Source Debugging for Java 1.4.0

jps -l -v

◀Sho

w fu

ll pac

kage n

ame

◀Sho

w JV

M arg

ument

s

Page 14: Open Source Debugging for Java 1.4.0

jps -l -v -m

◀Sho

w fu

ll pac

kage n

ame

◀Sho

w JV

M arg

ument

s

◀Sho

w ma

in() a

rgume

nts

Page 15: Open Source Debugging for Java 1.4.0

VIDEO JPS

Page 16: Open Source Debugging for Java 1.4.0

only local?

Page 17: Open Source Debugging for Java 1.4.0

jps 10.15.25.32

Page 18: Open Source Debugging for Java 1.4.0

How?

Page 19: Open Source Debugging for Java 1.4.0

Run jstatd daemon

Page 20: Open Source Debugging for Java 1.4.0

Allow-all policy

Page 21: Open Source Debugging for Java 1.4.0

jstatd -J-Djava.security.policy=allowall.pol

◀You

r Poli

cy

Page 22: Open Source Debugging for Java 1.4.0

grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission;};

Page 23: Open Source Debugging for Java 1.4.0

grant codebase "file:${java.home}/../lib/tools.jar" { permission java.net.SocketPermission "<YourDesktopHostnameOrIP>:1099", "accept, connect, listen, resolve";};

Page 24: Open Source Debugging for Java 1.4.0

let’s start up the jstatd daemon

Page 25: Open Source Debugging for Java 1.4.0

VIDEO JSTATD

Page 26: Open Source Debugging for Java 1.4.0

jps 10.15.25.32

Page 27: Open Source Debugging for Java 1.4.0

let’s run JPS from Windows

across the network to a Mac

Page 28: Open Source Debugging for Java 1.4.0

VIDEO JPS REMOTE

Page 29: Open Source Debugging for Java 1.4.0

jstat process info

Page 30: Open Source Debugging for Java 1.4.0

jstat -gcutil <pid>

◀Sho

w gar

bage c

ollec

tion

Page 31: Open Source Debugging for Java 1.4.0
Page 32: Open Source Debugging for Java 1.4.0

jstat -gcutil <pid> 500 999◀m

s betw

een sa

mples

◀repe

tition

s

Page 33: Open Source Debugging for Java 1.4.0

jstat -gcutil -h5 <pid> 500 999

◀Sho

w he

ader e

very X

lines

Page 34: Open Source Debugging for Java 1.4.0

VIDEO JSTAT REMOTE

Page 35: Open Source Debugging for Java 1.4.0

jstack stack dumps

Page 36: Open Source Debugging for Java 1.4.0

jstack <pid>

Page 37: Open Source Debugging for Java 1.4.0
Page 38: Open Source Debugging for Java 1.4.0

jstack -F <pid>

Page 39: Open Source Debugging for Java 1.4.0

jstack -l <pid>◀Verb

ose l

ock i

nfo

Page 40: Open Source Debugging for Java 1.4.0
Page 41: Open Source Debugging for Java 1.4.0

Direct this output to a file with a tdump extension

Use TDA on VisualVM to analyze it

Page 42: Open Source Debugging for Java 1.4.0

javap class file disassembler

Page 43: Open Source Debugging for Java 1.4.0

We added a new method to a class.

Is it on theserver-deployed copy

of the app?

Page 44: Open Source Debugging for Java 1.4.0

javap classfile

Page 45: Open Source Debugging for Java 1.4.0
Page 46: Open Source Debugging for Java 1.4.0

javap -v classfile

◀Verb

ose

Page 47: Open Source Debugging for Java 1.4.0
Page 48: Open Source Debugging for Java 1.4.0

major version: 48 = Java 1.4major version: 49 = Java 5major version: 50 = Java 6

Page 49: Open Source Debugging for Java 1.4.0

javap -s classfile◀Inte

rnal t

ype si

gnatu

res

Page 50: Open Source Debugging for Java 1.4.0
Page 51: Open Source Debugging for Java 1.4.0

javap -private classfile

◀Sho

w Priva

te me

thod

s

Page 52: Open Source Debugging for Java 1.4.0
Page 53: Open Source Debugging for Java 1.4.0

Survey

Page 54: Open Source Debugging for Java 1.4.0

StackOverflow.com

Page 55: Open Source Debugging for Java 1.4.0

Your favoriteOpen Source Debugging Tool?

Page 56: Open Source Debugging for Java 1.4.0

VisualVM

Page 57: Open Source Debugging for Java 1.4.0

Eclipse

Page 58: Open Source Debugging for Java 1.4.0

System.out.println(brokenobj);

System.out.println(brokenobj);System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

System.out.println(brokenobj);

Page 59: Open Source Debugging for Java 1.4.0

I’ve got the only tool I need

Page 60: Open Source Debugging for Java 1.4.0
Page 61: Open Source Debugging for Java 1.4.0
Page 62: Open Source Debugging for Java 1.4.0

jmap memory maps

Page 63: Open Source Debugging for Java 1.4.0

jmap histogram

Page 64: Open Source Debugging for Java 1.4.0

jmap -histo <pid>

Page 65: Open Source Debugging for Java 1.4.0
Page 66: Open Source Debugging for Java 1.4.0

jmap -histo:live <pid>

Page 67: Open Source Debugging for Java 1.4.0

jmap heap dump

Page 68: Open Source Debugging for Java 1.4.0

jmap -dump:file=myfile.hprof <pid>

Page 69: Open Source Debugging for Java 1.4.0
Page 70: Open Source Debugging for Java 1.4.0

java -XX:+HeapDumpOnOutOfMemoryError MyApp

Page 71: Open Source Debugging for Java 1.4.0

jinfo -flag +HeapDumpOnOutMemoryError <pid>

Page 72: Open Source Debugging for Java 1.4.0

OutOfMemoryErrorDrive in to office!

Page 73: Open Source Debugging for Java 1.4.0

jhat heap analysis

Page 74: Open Source Debugging for Java 1.4.0

jhat -J-Xmx512m <yourdump.hprof>

Page 75: Open Source Debugging for Java 1.4.0

jhat -J-Xmx512m <yourdump.hprof>

Page 76: Open Source Debugging for Java 1.4.0

jhat -J-Xmx512m <yourdump.hprof>

Page 77: Open Source Debugging for Java 1.4.0
Page 78: Open Source Debugging for Java 1.4.0

http://localhost:7000

Page 79: Open Source Debugging for Java 1.4.0
Page 80: Open Source Debugging for Java 1.4.0

OQL

Page 81: Open Source Debugging for Java 1.4.0
Page 82: Open Source Debugging for Java 1.4.0

select z from java.lang.String z

Page 83: Open Source Debugging for Java 1.4.0

select z from java.lang.String z where z.count >= 50

Page 84: Open Source Debugging for Java 1.4.0
Page 85: Open Source Debugging for Java 1.4.0

http://blogs.sun.com/sundararajan/date/200509

Page 86: Open Source Debugging for Java 1.4.0
Page 87: Open Source Debugging for Java 1.4.0

eclipse memory analyzerM.A.T.

Page 88: Open Source Debugging for Java 1.4.0

PurposeInvestigate memory usage.

Useful forVisualizing memory footprint.

Finding memory leaks.

Querying through (OQL) allocated memory.

Discovering heavy memory allocation sources.

EclipseMemoryAnalyzer

Page 89: Open Source Debugging for Java 1.4.0

GotchaDoesn’t create heap dumps, just analyzes.Available as a plugin or standalone RCP app.

EclipseMemoryAnalyzer

Page 90: Open Source Debugging for Java 1.4.0

java.lang.String

java.util.HashMap

char[]char[]char[]char[]char[]

java.lang.Stringjava.lang.String

char[]char[]char[]char[]char[]

char[]char[]char[]char[]char[]

Page 91: Open Source Debugging for Java 1.4.0

Shallow Heap

java.lang.String

java.util.HashMap

char[]char[]char[]char[]char[]

java.lang.Stringjava.lang.String

char[]char[]char[]char[]char[]

char[]char[]char[]char[]char[]

Page 92: Open Source Debugging for Java 1.4.0

Retained Heap

java.lang.String

java.util.HashMap

char[]char[]char[]char[]char[]

java.lang.Stringjava.lang.String

char[]char[]char[]char[]char[]

char[]char[]char[]char[]char[]

Page 93: Open Source Debugging for Java 1.4.0

Load a heap dump in MAT

Page 94: Open Source Debugging for Java 1.4.0

VIDEO ECLIPSE MAT

Page 95: Open Source Debugging for Java 1.4.0

Run some OQL on it

Page 96: Open Source Debugging for Java 1.4.0

VIDEO ECLIPSE MAT OQL

Page 97: Open Source Debugging for Java 1.4.0

btrace

Page 98: Open Source Debugging for Java 1.4.0
Page 99: Open Source Debugging for Java 1.4.0

Can you put a few debugging

“sysouts” into that running production

app?

Page 100: Open Source Debugging for Java 1.4.0

BTrace Tracing

Page 101: Open Source Debugging for Java 1.4.0

BTrace Tracing

Page 102: Open Source Debugging for Java 1.4.0

Production-timeOperates on deployed codeUses debugging hooks to re-deploy class filesRuntime injection of tracing statements

BTrace Tracing

Page 103: Open Source Debugging for Java 1.4.0

CodeTracing scripts written in Java.Limited to a catalog of static methods.Compiled at design time or tracing time.

Unsafe mode

BTrace Tracing

Page 104: Open Source Debugging for Java 1.4.0

CodeTracing scripts written in Java.Limited to a catalog of static methods.Compiled at design time or tracing time.

Unsafe mode

BTrace Tracing

Page 105: Open Source Debugging for Java 1.4.0

import com.sun.btrace.annotations.*;import static com.sun.btrace.BTraceUtils.*;import com.sun.btrace.AnyType;import java.lang.management.MemoryUsage;import java.util.concurrent.atomic.AtomicInteger;import java.util.Map;

@BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); }

/** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map<String, AtomicInteger> histo = newHashMap();

@OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } }}

Page 106: Open Source Debugging for Java 1.4.0

import com.sun.btrace.annotations.*;import static com.sun.btrace.BTraceUtils.*;import com.sun.btrace.AnyType;import java.lang.management.MemoryUsage;import java.util.concurrent.atomic.AtomicInteger;import java.util.Map;

@BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); }

/** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map<String, AtomicInteger> histo = newHashMap();

@OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } }}

Page 107: Open Source Debugging for Java 1.4.0

import com.sun.btrace.annotations.*;import static com.sun.btrace.BTraceUtils.*;import com.sun.btrace.AnyType;import java.lang.management.MemoryUsage;import java.util.concurrent.atomic.AtomicInteger;import java.util.Map;

@BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); }

/** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map<String, AtomicInteger> histo = newHashMap();

@OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } }}

Page 108: Open Source Debugging for Java 1.4.0

import com.sun.btrace.annotations.*;import static com.sun.btrace.BTraceUtils.*;import com.sun.btrace.AnyType;import java.lang.management.MemoryUsage;import java.util.concurrent.atomic.AtomicInteger;import java.util.Map;

@BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); }

/** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map<String, AtomicInteger> histo = newHashMap();

@OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } }}

Page 109: Open Source Debugging for Java 1.4.0

import com.sun.btrace.annotations.*;import static com.sun.btrace.BTraceUtils.*;import com.sun.btrace.AnyType;import java.lang.management.MemoryUsage;import java.util.concurrent.atomic.AtomicInteger;import java.util.Map;

@BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); }

/** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map<String, AtomicInteger> histo = newHashMap();

@OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } }}

Page 110: Open Source Debugging for Java 1.4.0

import com.sun.btrace.annotations.*;import static com.sun.btrace.BTraceUtils.*;import com.sun.btrace.AnyType;import java.lang.management.MemoryUsage;import java.util.concurrent.atomic.AtomicInteger;import java.util.Map;

@BTrace public class TraceAllMethodCalls { /** * METHOD CALL TRACEPOINT. */ @OnMethod( clazz="com.ambientideas.HelloWorldJava", method="print", location=@Location(value=Kind.CALL, clazz="/.*/", method="/.*/") ) public static void m(AnyType[] args) { //System.out.println("Hello"); println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } @OnMethod( clazz="/.*/", method="println" ) public static void m2(AnyType[] args) { println(strcat("****** WE'VE ENTERED A METHOD ON CLASS: ", name(probeClass()))); println(strcat("****** WE'VE ENTERED METHOD: ", probeMethod())); } /** * ONEXIT TRACEPOINT. CALLED WHEN A BTRACE METHOD CALLS EXIT(INT). */ @OnExit public static void onexit(int code) { println("****** THE BTRACE PROGRAM IS EXITING."); }

/** * LOW MEMORY TRACE POINT. */ @OnLowMemory( pool = "Tenured Gen", threshold=58720250 ) public static void onLowMem(MemoryUsage mu) { println("******"); println(mu); } /** * MEMORY HISTOGRAM TRACE POINT. */ private static Map<String, AtomicInteger> histo = newHashMap();

@OnTimer(4000) public static void print() { if (size(histo) != 0) { printNumberMap(strcat("******", "Component Histogram"), histo); } }}

Page 111: Open Source Debugging for Java 1.4.0
Page 112: Open Source Debugging for Java 1.4.0

visualvm

Page 113: Open Source Debugging for Java 1.4.0
Page 114: Open Source Debugging for Java 1.4.0

Useful for‣ Discovering the GC cycles of your app.

‣ Finding the largest memory usage culprits.

‣ Diffing memory snapshots.

‣ Injecting btrace code.

‣ Snapping heapdumps.

Page 115: Open Source Debugging for Java 1.4.0

GotchaDownload version 1.2 even if your JDK includes 1.0.Standalone version always ahead of JVM version.

Page 116: Open Source Debugging for Java 1.4.0

VisualVM in action

Page 117: Open Source Debugging for Java 1.4.0

BTrace in action

Page 118: Open Source Debugging for Java 1.4.0

omniscient debuggers

Page 119: Open Source Debugging for Java 1.4.0
Page 120: Open Source Debugging for Java 1.4.0

Luke, you candestroy the bug!

He has foreseen this.

It is your destiny.

Page 121: Open Source Debugging for Java 1.4.0

TOD(by Guillaume Pothier)

Page 122: Open Source Debugging for Java 1.4.0
Page 123: Open Source Debugging for Java 1.4.0

TOD✴ Eclipse-integrated omniscient debugger

✴ observe all memory changes

✴ execute once, review infinitely

✴ rewind and step through call stacks, loops

✴ Windows-only (DLL)

Page 124: Open Source Debugging for Java 1.4.0

VIDEO TOD

Page 125: Open Source Debugging for Java 1.4.0

comprehension tools

Page 126: Open Source Debugging for Java 1.4.0

Goal:Comprehend the application runtime call sequence better.

Page 127: Open Source Debugging for Java 1.4.0

amida

Page 128: Open Source Debugging for Java 1.4.0

amidahttp://sel.ist.osaka-u.ac.jp/~ishio/amida/

Page 129: Open Source Debugging for Java 1.4.0

jtracert

Page 130: Open Source Debugging for Java 1.4.0

jtracerthttp://code.google.com/p/jtracert/

Page 131: Open Source Debugging for Java 1.4.0

Eclipse TPTP

Page 132: Open Source Debugging for Java 1.4.0

Eclipse TPTP

✴ profile an application’s performance

✴ render call sequence diagrams

✴ almost ready for Mac OS

Page 133: Open Source Debugging for Java 1.4.0

VIDEO TPTP

Page 134: Open Source Debugging for Java 1.4.0

decompiling tools

Page 135: Open Source Debugging for Java 1.4.0

cavaj

Page 136: Open Source Debugging for Java 1.4.0

JODE

Page 137: Open Source Debugging for Java 1.4.0

JD-Eclipse

Page 138: Open Source Debugging for Java 1.4.0
Page 139: Open Source Debugging for Java 1.4.0
Page 140: Open Source Debugging for Java 1.4.0
Page 141: Open Source Debugging for Java 1.4.0

System.out.println()

Page 142: Open Source Debugging for Java 1.4.0

ancient weapons are no match...

Page 143: Open Source Debugging for Java 1.4.0

bring a better weapon to the fight

Page 144: Open Source Debugging for Java 1.4.0

if a bug

strikesyoudown...

Page 145: Open Source Debugging for Java 1.4.0

You work the weekend solving it.

Page 146: Open Source Debugging for Java 1.4.0

Matthew [email protected]

Page 147: Open Source Debugging for Java 1.4.0

May the debugging force be with you.

Matthew [email protected]

Page 148: Open Source Debugging for Java 1.4.0

Thanks in advance for

your completed evals!

Page 149: Open Source Debugging for Java 1.4.0

Code Examples http://github.com/matthewmccullough

Twitter

@matthewmccull

Email

[email protected]

Blog

http://www.ambientideas.com/blog sidebar has my social networking profile links

Page 150: Open Source Debugging for Java 1.4.0

Eclipse Memory Analyzerhttp://www.eclipse.org/mat/

VisualVMhttps://visualvm.dev.java.net/

GCHistohttps://gchisto.dev.java.net/

BTracehttps://btrace.dev.java.net/

DTrace, XRay, Instrumentshttp://en.wikipedia.org/wiki/DTrace

Resources

Page 151: Open Source Debugging for Java 1.4.0

TODhttp://pleiad.cl/tod/

JTracerthttp://code.google.com/p/jtracert/

Amidahttp://sel.ist.osaka-u.ac.jp/~ishio/amida/

TPTPhttp://www.eclipse.org/tptp/

JD-Eclipsehttp://java.decompiler.free.fr/

Resources

Page 152: Open Source Debugging for Java 1.4.0

‣ http://www.ambientideasphotography.com‣ http://upload.wikimedia.org/wikipedia/commons/a/a4/

BernardMadoff.jpg‣ http://flickr.com/photos/triller/2226679393/‣ http://flickr.com/photos/ektogamat/2687444500/‣ http://flickr.com/photos/bfionline/2380398799/‣ http://flickr.com/photos/symphoney/76513801/‣ http://flickr.com/photos/foxypar4/2124673642/‣ http://flickr.com/photos/morberg/3146874095/‣ http://flickr.com/photos/triller/2226679393/

Image Credits