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

Open Source Debugging for Java 1.4.0

Embed Size (px)

DESCRIPTION

Open Source Debugging for Java given at the Dallas MUG

Citation preview

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