open source debugging for java 1.4.0
DESCRIPTION
Open Source Debugging for Java given at the Dallas MUGTRANSCRIPT
![Page 1: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/1.jpg)
by Matthew McCullough of Ambient Ideas, LLC
Java Debugging Tools
Open Source
![Page 2: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/2.jpg)
Code Examples http://github.com/matthewmccullough
@matthewmccull
Blog
http://www.ambientideas.com/blog sidebar has my social networking profile links
![Page 3: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/3.jpg)
http://delicious.com/matthew.mccullough/opensource+debugging
![Page 4: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/4.jpg)
Not
![Page 5: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/5.jpg)
Instead
![Page 6: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/6.jpg)
![Page 7: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/7.jpg)
VisualVM
Eclipse MAT
jstack
jhatjmap
jstat
jstatdTOD
TPTP
jps
![Page 8: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/8.jpg)
Hotspot JVMs
![Page 9: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/9.jpg)
jps process list
![Page 10: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/10.jpg)
What JVM options did we use when we started up the app
server?
![Page 11: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/11.jpg)
jps
![Page 12: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/12.jpg)
jps -l
◀Sho
w fu
ll pac
kage n
ame
![Page 13: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/13.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/14.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/15.jpg)
VIDEO JPS
![Page 16: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/16.jpg)
only local?
![Page 17: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/17.jpg)
jps 10.15.25.32
![Page 18: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/18.jpg)
How?
![Page 19: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/19.jpg)
Run jstatd daemon
![Page 20: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/20.jpg)
Allow-all policy
![Page 21: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/21.jpg)
jstatd -J-Djava.security.policy=allowall.pol
◀You
r Poli
cy
![Page 22: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/22.jpg)
grant codebase "file:${java.home}/../lib/tools.jar" { permission java.security.AllPermission;};
![Page 23: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/23.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/24.jpg)
let’s start up the jstatd daemon
![Page 25: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/25.jpg)
VIDEO JSTATD
![Page 26: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/26.jpg)
jps 10.15.25.32
![Page 27: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/27.jpg)
let’s run JPS from Windows
across the network to a Mac
![Page 28: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/28.jpg)
VIDEO JPS REMOTE
![Page 29: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/29.jpg)
jstat process info
![Page 30: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/30.jpg)
jstat -gcutil <pid>
◀Sho
w gar
bage c
ollec
tion
![Page 31: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/31.jpg)
![Page 32: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/32.jpg)
jstat -gcutil <pid> 500 999◀m
s betw
een sa
mples
◀repe
tition
s
![Page 33: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/33.jpg)
jstat -gcutil -h5 <pid> 500 999
◀Sho
w he
ader e
very X
lines
![Page 34: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/34.jpg)
VIDEO JSTAT REMOTE
![Page 35: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/35.jpg)
jstack stack dumps
![Page 36: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/36.jpg)
jstack <pid>
![Page 37: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/37.jpg)
![Page 38: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/38.jpg)
jstack -F <pid>
![Page 39: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/39.jpg)
jstack -l <pid>◀Verb
ose l
ock i
nfo
![Page 40: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/40.jpg)
![Page 41: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/41.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/42.jpg)
javap class file disassembler
![Page 43: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/43.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/44.jpg)
javap classfile
![Page 45: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/45.jpg)
![Page 46: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/46.jpg)
javap -v classfile
◀Verb
ose
![Page 47: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/47.jpg)
![Page 48: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/48.jpg)
major version: 48 = Java 1.4major version: 49 = Java 5major version: 50 = Java 6
![Page 49: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/49.jpg)
javap -s classfile◀Inte
rnal t
ype si
gnatu
res
![Page 50: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/50.jpg)
![Page 51: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/51.jpg)
javap -private classfile
◀Sho
w Priva
te me
thod
s
![Page 52: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/52.jpg)
![Page 53: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/53.jpg)
Survey
![Page 54: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/54.jpg)
StackOverflow.com
![Page 55: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/55.jpg)
Your favoriteOpen Source Debugging Tool?
![Page 56: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/56.jpg)
VisualVM
❸
![Page 57: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/57.jpg)
Eclipse
❷
![Page 58: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/58.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/59.jpg)
I’ve got the only tool I need
![Page 60: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/60.jpg)
![Page 61: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/61.jpg)
![Page 62: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/62.jpg)
jmap memory maps
![Page 63: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/63.jpg)
jmap histogram
![Page 64: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/64.jpg)
jmap -histo <pid>
![Page 65: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/65.jpg)
![Page 66: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/66.jpg)
jmap -histo:live <pid>
![Page 67: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/67.jpg)
jmap heap dump
![Page 68: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/68.jpg)
jmap -dump:file=myfile.hprof <pid>
![Page 69: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/69.jpg)
![Page 70: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/70.jpg)
java -XX:+HeapDumpOnOutOfMemoryError MyApp
![Page 71: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/71.jpg)
jinfo -flag +HeapDumpOnOutMemoryError <pid>
![Page 72: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/72.jpg)
OutOfMemoryErrorDrive in to office!
![Page 73: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/73.jpg)
jhat heap analysis
![Page 74: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/74.jpg)
jhat -J-Xmx512m <yourdump.hprof>
![Page 75: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/75.jpg)
jhat -J-Xmx512m <yourdump.hprof>
![Page 76: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/76.jpg)
jhat -J-Xmx512m <yourdump.hprof>
![Page 77: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/77.jpg)
![Page 78: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/78.jpg)
http://localhost:7000
![Page 79: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/79.jpg)
![Page 80: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/80.jpg)
OQL
![Page 81: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/81.jpg)
![Page 82: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/82.jpg)
select z from java.lang.String z
![Page 83: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/83.jpg)
select z from java.lang.String z where z.count >= 50
![Page 84: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/84.jpg)
![Page 85: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/85.jpg)
http://blogs.sun.com/sundararajan/date/200509
![Page 86: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/86.jpg)
![Page 87: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/87.jpg)
eclipse memory analyzerM.A.T.
![Page 88: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/88.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/89.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/90.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/91.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/92.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/93.jpg)
Load a heap dump in MAT
![Page 94: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/94.jpg)
VIDEO ECLIPSE MAT
![Page 95: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/95.jpg)
Run some OQL on it
![Page 96: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/96.jpg)
VIDEO ECLIPSE MAT OQL
![Page 97: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/97.jpg)
btrace
![Page 98: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/98.jpg)
![Page 99: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/99.jpg)
Can you put a few debugging
“sysouts” into that running production
app?
![Page 100: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/100.jpg)
BTrace Tracing
![Page 101: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/101.jpg)
BTrace Tracing
![Page 102: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/102.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/103.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/104.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/105.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/106.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/107.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/108.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/109.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/110.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/111.jpg)
![Page 112: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/112.jpg)
visualvm
![Page 113: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/113.jpg)
![Page 114: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/114.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/115.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/116.jpg)
VisualVM in action
![Page 117: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/117.jpg)
BTrace in action
![Page 118: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/118.jpg)
omniscient debuggers
![Page 119: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/119.jpg)
![Page 120: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/120.jpg)
Luke, you candestroy the bug!
He has foreseen this.
It is your destiny.
![Page 121: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/121.jpg)
TOD(by Guillaume Pothier)
![Page 122: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/122.jpg)
![Page 123: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/123.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/124.jpg)
VIDEO TOD
![Page 125: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/125.jpg)
comprehension tools
![Page 126: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/126.jpg)
Goal:Comprehend the application runtime call sequence better.
![Page 127: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/127.jpg)
amida
![Page 128: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/128.jpg)
amidahttp://sel.ist.osaka-u.ac.jp/~ishio/amida/
![Page 129: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/129.jpg)
jtracert
![Page 130: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/130.jpg)
jtracerthttp://code.google.com/p/jtracert/
![Page 131: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/131.jpg)
Eclipse TPTP
![Page 132: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/132.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/133.jpg)
VIDEO TPTP
![Page 134: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/134.jpg)
decompiling tools
![Page 135: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/135.jpg)
cavaj
![Page 136: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/136.jpg)
JODE
![Page 137: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/137.jpg)
JD-Eclipse
![Page 138: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/138.jpg)
![Page 139: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/139.jpg)
![Page 140: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/140.jpg)
![Page 141: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/141.jpg)
System.out.println()
![Page 142: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/142.jpg)
ancient weapons are no match...
![Page 143: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/143.jpg)
bring a better weapon to the fight
![Page 144: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/144.jpg)
if a bug
strikesyoudown...
![Page 145: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/145.jpg)
You work the weekend solving it.
![Page 146: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/146.jpg)
Matthew [email protected]
![Page 148: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/148.jpg)
Thanks in advance for
your completed evals!
![Page 149: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/149.jpg)
Code Examples http://github.com/matthewmccullough
@matthewmccull
Blog
http://www.ambientideas.com/blog sidebar has my social networking profile links
![Page 150: Open Source Debugging for Java 1.4.0](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/150.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/151.jpg)
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](https://reader034.vdocuments.mx/reader034/viewer/2022052505/555087c0b4c9051e5b8b4b28/html5/thumbnails/152.jpg)
‣ 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