EMMA Coverage Report (generated Sat Jun 02 16:47:50 EDT 2012)
[all classes][net.sf.madmap]

COVERAGE SUMMARY FOR SOURCE FILE [BinaryDumpReader.java]

nameclass, %method, %block, %line, %
BinaryDumpReader.java100% (1/1)73%  (19/26)60%  (1075/1790)72%  (268.6/372)

COVERAGE BREAKDOWN BY CLASS AND METHOD

nameclass, %method, %block, %line, %
     
class BinaryDumpReader100% (1/1)73%  (19/26)60%  (1075/1790)72%  (268.6/372)
handleHeapDumpEnd (): void 0%   (0/1)0%   (0/9)0%   (0/3)
handleJavaFrame (): void 0%   (0/1)0%   (0/42)0%   (0/7)
handleMonitorUsed (): void 0%   (0/1)0%   (0/26)0%   (0/5)
handleStackFrame (): void 0%   (0/1)0%   (0/42)0%   (0/11)
handleStickyClass (): void 0%   (0/1)0%   (0/26)0%   (0/5)
handleUnloadClass (): void 0%   (0/1)0%   (0/27)0%   (0/6)
usage (): void 0%   (0/1)0%   (0/7)0%   (0/3)
getIdentifier (): long 100% (1/1)28%  (9/32)29%  (2/7)
openHprofFile (String): FileInputStream 100% (1/1)32%  (7/22)33%  (2/6)
handleJNIGlobal (): void 100% (1/1)53%  (18/34)83%  (5/6)
handleJNILocal (): void 100% (1/1)55%  (23/42)86%  (6/7)
handleString (): void 100% (1/1)58%  (40/69)83%  (10/12)
go (): void 100% (1/1)59%  (98/166)70%  (26.4/38)
handleStackTrace (): void 100% (1/1)62%  (28/45)75%  (7.5/10)
handleThreadObject (): void 100% (1/1)64%  (37/58)88%  (7/8)
handleClass (): void 100% (1/1)66%  (277/420)82%  (67.4/82)
handleObjArray (): void 100% (1/1)67%  (95/141)91%  (20/22)
handleHeapDump (): void 100% (1/1)68%  (65/96)68%  (27/40)
handleLoadClass (): void 100% (1/1)70%  (57/82)92%  (13.9/15)
handleObjInstance (): void 100% (1/1)71%  (140/198)91%  (32.7/36)
handlePrimArray (): void 100% (1/1)75%  (68/91)92%  (12/13)
<static initializer> 100% (1/1)75%  (6/8)75%  (0.8/1)
BinaryDumpReader (): void 100% (1/1)100% (44/44)100% (14/14)
parse (Madmap, String): void 100% (1/1)100% (51/51)100% (13/13)
setLogger (ILogger): void 100% (1/1)100% (4/4)100% (1/1)
updateSizeRead (int): int 100% (1/1)100% (8/8)100% (1/1)

1/*
2 * Copyright 2010 Eric Caspole
3 * 
4 * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this
5 * file except in compliance with the License. You may obtain a copy of the License at
6 * 
7 * http://www.apache.org/licenses/LICENSE-2.0
8 * 
9 * Unless required by applicable law or agreed to in writing, software distributed under
10 * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11 * KIND, either express or implied. See the License for the specific language governing
12 * permissions and limitations under the License.
13 */
14 
15package net.sf.madmap;
16 
17import java.io.*;
18import java.net.*;
19import java.util.*;
20import java.util.concurrent.*;
21 
22public class BinaryDumpReader implements IHprofReader {
23  String            _fileName;
24  FileInputStream   _fis;
25  DataInputStream   _dis;
26  BufferedInputStream   _bis;
27  
28  int               _identifierSize = 0;
29  boolean           _done;
30  HashMap<Long,String> _stringTable    = new HashMap<Long,String>();
31  
32  Madmap       _owner              = null;
33  
34  ConcurrentHashMap<HprofHeapAllocation,HprofHeapAllocation>       _heap_objects_table = null;
35  ConcurrentHashMap       _stack_trace_table  = null;
36  ConcurrentHashMap       _threads_list       = null;
37  Vector          _roots_list         = null;
38  ConcurrentHashMap<HprofClassElement,HprofClassElement>       _class_list         = null;
39 
40  boolean         _verbose            = false;
41 
42  static final int STRING     = 1;
43  static final int LOAD_CLASS = 2; 
44  static final int UNLOAD_CLASS = 3; 
45  static final int STACK_FRAME = 4; 
46  static final int STACK_TRACE = 5; 
47  static final int HEAP_DUMP  = 12;
48  static final int HEAP_DUMP_SEGMENT = 0x1c;
49  static final int HEAP_DUMP_END = 0x2c;
50 
51  static final int ROOT_UNKNOWN     = -1;
52  static final int ROOT_JNI_GLOBAL  = 1;
53  static final int ROOT_JNI_LOCAL   = 2;
54  static final int ROOT_JAVA_FRAME  = 3;
55  static final int ROOT_NATIVE_STACK  = 4;
56  static final int ROOT_STICKY_CLASS  = 5;
57  static final int ROOT_THREAD_BLOCK  = 6;
58  static final int ROOT_MONITOR_USED  = 7;
59  static final int ROOT_THREAD_OBJECT = 8;
60 
61  static final int CLASS_DUMP         = 0x20;
62  static final int INSTANCE_DUMP      = 0x21;
63  static final int OBJ_ARRAY_DUMP     = 0x22;
64  static final int PRIM_ARRAY_DUMP    = 0x23;
65 
66  ILogger        _logger;
67  public void setLogger( ILogger logger ) { _logger = logger; }
68 
69  public BinaryDumpReader() {}
70  
71  public void parse( Madmap owner, String fileName) {
72    _owner = owner;
73    _fileName    = fileName;
74    _fis = openHprofFile(_fileName);
75    _bis = new BufferedInputStream( _fis );
76    _dis = new DataInputStream( _bis );
77    _done = false;
78 
79    _heap_objects_table = owner.getObjects();
80    _stack_trace_table  = owner.getStackTraces();
81    _threads_list       = owner.getThreads();
82    _roots_list         = owner.getRoots();
83    _class_list         = owner.getClasses();
84    go();
85  }
86  
87  public static FileInputStream openHprofFile(String fileName)
88  {
89    FileInputStream      fis;
90    
91    try {   
92      fis = new FileInputStream(fileName);
93      return fis;
94    } catch ( Exception ie ) {
95      System. out. println ( "Error opening file : Caught " + ie );
96    ie.printStackTrace();
97    }
98    return null;
99  }
100 
101 
102  long getIdentifier() throws IOException {
103    if ( _identifierSize == 4 ) {
104      return (long)_dis.readInt();
105    } else if ( _identifierSize == 8 ) {
106      return _dis.readLong();    
107    } else {
108      System. out. println ( "Unsupported _identifierSize = " + _identifierSize );
109      System.exit(-1);      
110    }
111    return 0;
112  }
113  
114 
115  public void handleString() throws java.io.IOException {
116    int time        = _dis.readInt();
117    int length      = _dis.readInt();
118    
119    if (MadmapMain.runDump()) {
120      System.out.println("length=" + length + " time=" + time    );
121    }
122    // stringId is included in length
123    long stringId   = getIdentifier();
124    byte[] rawBytes = new byte[ length - _identifierSize ];
125    
126    int bytesRead   = _dis.read( rawBytes );
127    String body     = new String( rawBytes );
128    
129    _stringTable.put(stringId, body.intern());
130    if (MadmapMain.runDump()) {
131      System. out. println ( "String: " + Long.toHexString( stringId ) + " " + body );
132    }
133  }
134  
135  int _totalLoadClass = 0;
136  int _totalClass = 0;
137 
138  public void handleLoadClass() throws java.io.IOException {
139    int time    = _dis.readInt();
140    int length  = _dis.readInt();
141   
142    int serialNum   = _dis.readInt();
143    long objId      = getIdentifier();
144    int stkTrc      = _dis.readInt();
145    long classNameStringId = getIdentifier();
146 
147    String className = (String) _stringTable.get(classNameStringId);
148    assert className != null : "no class name?";
149    className = className.intern();
150    
151    ++_totalLoadClass;
152    if (MadmapMain.runDump()) {
153      System. out. println ( "Load Class: " + Long.toHexString( objId ) + "    " + className + "  " + (_totalLoadClass));
154    }
155    
156    HprofClassElement loadClass = new HprofBinClassElement(objId, className);
157    _class_list.put(loadClass, loadClass);
158  }
159 
160  void handlePrimArray() throws java.io.IOException {
161    long id       = getIdentifier();
162    int stk = _dis.readInt();
163    int sz  = _dis.readInt();
164    byte typ  = _dis.readByte();
165    
166    updateSizeRead(sz);
167 
168    if (MadmapMain.runDump()) {
169      System. out. println ( "prim array:  0x" + Long.toHexString( id ) + " stk: " + stk + " sz: " + sz + " type: " + typ );
170    }
171    int typeSize = BasicTypeInfo.DUMMY.get(typ).getSize();
172    // skip over elems
173    for ( int i = 0; i<(sz * typeSize); i++ ) {
174      byte b = _dis.readByte();
175    }
176    
177    HprofArrayObject thisArray = new HprofArrayObject(id, BasicTypeInfo.DUMMY.get(typ).getName(), 
178        stk, (sz*typeSize), sz, Madmap.getFakeArrayClass(BasicTypeInfo.DUMMY.get(typ).getName()), null);
179    _heap_objects_table.put(thisArray, thisArray);
180  }
181  
182  void handleObjArray() throws java.io.IOException {
183    long id       = getIdentifier();
184    int stk       = _dis.readInt();
185    int sz        = _dis.readInt();
186    long classId  = getIdentifier();
187    ArrayList<Long> elems = new ArrayList<Long>();
188    
189    updateSizeRead(sz);
190 
191    for (int i=0; i<sz; i++) {
192      long ref = getIdentifier();
193      // Dont include null refs to be more compatible with ascii dumps
194      if (ref != 0) {
195        elems.add(ref);
196      }
197    }
198    
199    HprofBinClassElement theClass = (HprofBinClassElement)_class_list.get(new HprofHeapElement(classId));
200    //assert (theClass != null) || (sz == 0): "cant find non-zero length obj array class 0x" + Long.toHexString(classId);
201 
202    // FIX ME
203    if (theClass == null) {
204      if (MadmapMain.runDump()) {
205        System. out. println ("### obj array:  0x" + Long.toHexString(id) + " cant find obj array class 0x" + Long.toHexString(classId));
206      }
207      String tmpName = "OBJECT_ARRAY";
208      theClass = new HprofBinClassElement(classId, tmpName);
209      _class_list.put(theClass, theClass);
210    }
211    
212    if (MadmapMain.runDump()) {
213      System. out. println ( "obj array:  0x" + Long.toHexString( id ) + " sz: " + sz + " nelems: " + 
214          elems.size() + " classId: 0x" + Long.toHexString(classId) + " " + theClass.className());
215    }
216    
217    HprofArrayObject thisArray = new HprofArrayObject(id, theClass.className(), stk, (sz*_identifierSize), elems.size(), theClass, elems);
218    _heap_objects_table.put(thisArray, thisArray);
219  }
220  
221 
222  void handleObjInstance() throws java.io.IOException {
223    long id       = getIdentifier();
224    int stk       = _dis.readInt();
225    long classId  = getIdentifier();
226    int sz        = _dis.readInt();
227    //byte[] values = new byte[sz];
228    
229    HprofBinClassElement theClass = (HprofBinClassElement)_class_list.get(new HprofHeapElement(classId));
230 
231    assert theClass != null : "no class for obj " + id;
232 
233    ArrayList<Byte> type_info = theClass.getNonStaticTypeInfo();
234    long instanceSize = theClass.instanceSize();
235    
236    if (MadmapMain.runDump()) {
237      System. out. println ( "obj instance:  0x" + Long.toHexString( id ) + " stk: " + 
238          Long.toHexString(stk) + " sz: " + sz + " class: " + theClass.className() + 
239          " inst sz from class: " + instanceSize + " type:" + type_info);
240    }
241    
242    ArrayList names = null;
243    ArrayList refs  = null;
244    
245    if (type_info != null && type_info.size() > 0) {
246      names = new ArrayList();
247      refs  = new ArrayList();        
248      int refCounter = 0;
249      for (int i=0; i<type_info.size(); i++) {
250        byte typeCode = type_info.get(i);
251        if (typeCode == 2) {
252          long ref = getIdentifier();
253          if (ref != 0) {
254            refs.add(ref);
255            names.add(theClass.nonstatic_field_names().get(refCounter));
256          }
257          refCounter++;
258        } else {
259          // skip over non-object fields
260          int fieldSize = BasicTypeInfo.DUMMY.get((int)typeCode).getSize();
261          for ( int j = 0; j<fieldSize; j++ ) {
262            byte entryData = _dis.readByte();
263          }
264        }
265      }
266    }
267 
268    HprofObject obj = new HprofObject( id, theClass.className(), theClass, sz, 0, names, refs);
269    _heap_objects_table.put(obj, obj);
270    
271    // check this later
272    if (names != null && names.size() > 0) {
273      obj.set_member_name_indexes(theClass.setNonstaticFieldNames(names));
274    }
275 
276    if ( !MadmapMain.noGUI()) {
277      _owner.getWindow().getProgressBar().setValue(updateSizeRead(sz));
278      _owner.getWindow().updateMemoryProgressBar();
279    }          
280  }
281  
282 
283  /**
284   * Load the class fields. When all the classes have been loaded, fill in
285   * the complete type info for each class instead of looking it up in 
286   * each superclass later on.
287   * @throws java.io.IOException
288   */
289  void handleClass() throws java.io.IOException {
290    long classId   = getIdentifier();
291    int stk = _dis.readInt();
292    long superClassId       = getIdentifier();
293    long loaderId       = getIdentifier();
294    long signersId       = getIdentifier();
295    long protDomainId       = getIdentifier();
296    long res1       = getIdentifier();
297    long res2       = getIdentifier();
298    int instanceSize  = _dis.readInt();
299    long classNameStringId;
300 
301    ArrayList<Byte> instanceFieldTypes = null;
302    ArrayList<String> instanceFieldNames = null;
303    
304    // skip over cp entries
305    short cpCount  = _dis.readShort();
306    for ( int i = 0; i < cpCount; i++ ) {
307      short idx = _dis.readShort();
308      byte b = _dis.readByte();
309      int sz = BasicTypeInfo.DUMMY.get((int)b).getSize();
310      for ( int j = 0; j<sz; j++ ) {
311        byte entryData = _dis.readByte();
312      }
313    }
314        
315    ArrayList staticNames = new ArrayList();
316    ArrayList staticRefs  = new ArrayList();
317    
318    {
319      // load static fields
320      short staticCount  = _dis.readShort();
321      int sz = -1;
322      for ( int i = 0; i < staticCount; i++ ) {
323        long fieldNameStrId = getIdentifier();
324        byte b = _dis.readByte();
325        assert b != 0 : "static field type should not be 0";
326        
327        // fix this magic number
328        if (b == 2) {
329          long ref = getIdentifier();
330          if (ref != 0) {
331            staticNames.add(_stringTable.get(fieldNameStrId));
332            staticRefs.add(ref);
333          }
334        } else {
335          sz = BasicTypeInfo.DUMMY.get((int)b).getSize();
336          for ( int j = 0; j<sz; j++ ) {
337            byte entryData = _dis.readByte();
338          }
339        }
340      }
341    }
342 
343    ArrayList nonstaticNames  = new ArrayList();    
344 
345    // load instance field names
346    short instanceFieldCount  = _dis.readShort();
347    if (instanceFieldCount > 0) {
348      instanceFieldTypes = new ArrayList<Byte>();
349      instanceFieldNames = new ArrayList<String>();
350      for ( int i = 0; i < instanceFieldCount; i++ ) {
351        long fieldNameStrId   = getIdentifier();
352        byte b = _dis.readByte();
353        
354        assert (b>1) && (b<12) : "unknown typecode in instance field = " + b;
355        String s = _stringTable.get(fieldNameStrId);
356        assert s != null : "String for ref was null: " + fieldNameStrId;          
357 
358        instanceFieldTypes.add(b);
359        instanceFieldNames.add(s);
360        
361        // Objects only
362        if (b == 2) {
363          nonstaticNames.add(s);
364        } 
365      }
366    }
367    
368    ++_totalClass;
369    
370    assert _totalClass<=_totalLoadClass : "_totalClass > _totalLoadClass??";
371 
372    HprofBinClassElement theClass = (HprofBinClassElement)_class_list.get(new HprofHeapElement(classId));
373    if (theClass != null ) {
374      theClass.updateLoadClass(stk, instanceSize, superClassId, loaderId, staticNames, staticRefs);
375      
376      // Add all instance field type info, need it to parse the objects
377      if (instanceFieldTypes != null) {
378        theClass.setNonStaticTypeInfo(instanceFieldTypes);
379      }
380      
381      if (nonstaticNames.size() > 0) {
382        theClass.setNonstaticFieldNames(nonstaticNames);
383      }
384 
385      if (MadmapMain.runDump()) {
386        System. out. println ("class: 0x" + Long.toHexString( classId ) + " super: 0x" + Long.toHexString(superClassId) + "  " +  
387            theClass.className() + " instanceFieldCount: " + instanceFieldCount + "  instanceFieldTypes: " + 
388            instanceFieldTypes + " instanceSize: " + instanceSize + "  " + (_totalClass));
389      }
390    } else {
391      assert false : "no load class yet";
392    }
393    
394    if (_totalClass == _totalLoadClass) {
395      if (MadmapMain.verbose()) {      
396        System. out. println ("Found " + _totalClass + " classes in the heap dump.");
397      }
398      int i = 0;
399      
400      if ( !MadmapMain.noGUI()) {
401        _owner.getWindow().getProgressBar().setMaximum((int)_totalLoadClass);
402        _owner.getWindow().getLabelForProgressBar().setText("Building Class Info");
403      }
404      
405      Collection<HprofClassElement> hoc = _class_list.values();
406      Iterator<HprofClassElement>   ihoc = hoc.iterator();
407      while( ihoc.hasNext() ) {
408        HprofBinClassElement currClass = (HprofBinClassElement) ihoc.next();
409        currClass.buildSuperTypeInfo(_class_list);
410        if ( !MadmapMain.noGUI()) {
411          _owner.getWindow().getProgressBar().setValue(i++);
412        }      
413      }
414    }
415    if ( !MadmapMain.noGUI()) {
416      _owner.getWindow().getProgressBar().setMaximum((int)_heapDumpSize);
417      _owner.getWindow().getLabelForProgressBar().setText("Loading Objects");
418      _owner.getWindow().updateMemoryProgressBar();
419    }
420  }
421 
422  void handleThreadObject() throws java.io.IOException {
423    long id       = getIdentifier();
424    int thdNum  = _dis.readInt();
425    int stk = _dis.readInt();
426 
427    if (MadmapMain.runDump()) {
428      System. out. println ( "thread object:  0x" + Long.toHexString( id ) + " stk: " + Long.toHexString(stk) + " thdNum: " + thdNum );
429    }
430    _roots_list.add( new HprofRoot(id, "<thread block>"));
431    _threads_list.put( id, new HprofThreadData(null, thdNum, id, null));
432  }
433 
434  void handleJNIGlobal() throws java.io.IOException {
435    long id     = getIdentifier();
436    long jniId  = getIdentifier();
437 
438    if (MadmapMain.runDump()) {
439      System. out. println ( "jni global:  0x" + Long.toHexString( id ) + " jniId: " + Long.toHexString(jniId));
440    }
441    _roots_list.add( new HprofRoot(id, "<JNI local ref>"));
442  }
443 
444  void handleJNILocal() throws java.io.IOException {
445    long  id     = getIdentifier();
446    int   thdId  = _dis.readInt();
447    int   frameId  = _dis.readInt();
448 
449    if (MadmapMain.runDump()) {
450      System. out. println ( "jni local:  0x" + Long.toHexString( id ) + " thdId: " + thdId + " frame: " + frameId);
451    }
452    _roots_list.add( new HprofRoot(id, "<JNI local ref>"));
453  }
454 
455 
456  void handleJavaFrame() throws java.io.IOException {
457    long  id     = getIdentifier();
458    int   thdId  = _dis.readInt();
459    int   frameId  = _dis.readInt();
460 
461    if (MadmapMain.verbose()) {
462      System. out. println ( "handleJavaFrame:  0x" + Long.toHexString( id ) + " thdId: " + thdId + " frame: " + frameId);
463    }
464    _roots_list.add( new HprofRoot(id, "<thread block>"));
465  }
466 
467 
468  void handleStickyClass() throws java.io.IOException {
469    long id     = getIdentifier();
470 
471    if (MadmapMain.runDump()) {
472      System. out. println ("sticky class:  0x" + Long.toHexString( id ));
473    }
474    _roots_list.add( new HprofRoot(id, "<system class>"));
475  }
476 
477  void handleMonitorUsed() throws java.io.IOException {
478    long id     = getIdentifier();
479 
480    if (MadmapMain.runDump()) {
481      System. out. println ("handleMonitorUsed:  0x" + Long.toHexString( id ));
482    }
483    _roots_list.add( new HprofRoot(id, "<thread block>"));
484  }
485 
486  
487  int _heapDumpSize = 0;
488  int _sizeRead     = 0;
489  
490  /**
491   * updateSizeRead 
492   * The total computed in this method is used to give a 
493   * rough idea in the progress bar
494   * @param sz
495   * @return the total size read so far        
496   */
497  int updateSizeRead(int sz) {
498    return _sizeRead += sz;
499  }
500 
501  public void handleHeapDumpEnd() throws java.io.IOException {
502    int time    = _dis.readInt();
503    int length  = _dis.readInt();
504 
505  }
506 
507  public void handleHeapDump() throws java.io.IOException {
508    int time    = _dis.readInt();
509    int length  = _dis.readInt();
510    int tag    = _dis.readByte();
511   
512    _heapDumpSize = length;
513    if (MadmapMain.verbose()) {
514      System. out. println ( "Heap Dump  time: " + time + "  length: " + length );
515    }
516    while ( true ) {    
517      //System. out. println ( "tag:  0x" + Integer.toHexString( tag ) );
518      switch (tag) {
519        case INSTANCE_DUMP:
520          handleObjInstance();
521          break;
522        case PRIM_ARRAY_DUMP:
523          handlePrimArray();
524          break;
525        case OBJ_ARRAY_DUMP:
526          handleObjArray();
527          break;
528        case CLASS_DUMP:
529          handleClass();
530          break;
531        case ROOT_THREAD_OBJECT:
532          handleThreadObject();
533          break;
534        case ROOT_JNI_GLOBAL:
535          handleJNIGlobal();
536          break;
537        case ROOT_JAVA_FRAME:
538          handleJavaFrame();
539          break;
540        case ROOT_JNI_LOCAL:
541          handleJNILocal();
542          break;
543        case ROOT_MONITOR_USED:
544          handleMonitorUsed();
545          break;
546        case ROOT_STICKY_CLASS:
547          handleStickyClass();
548          break;
549        case HEAP_DUMP_SEGMENT:
550          handleHeapDump();
551          break;
552        case HEAP_DUMP_END:
553          handleHeapDumpEnd();
554          System.out.println ( "Found HEAP_DUMP_END " );
555          break;
556        default:
557          System. out. println ( " Unimplemented:  0x" + Integer.toHexString( tag ) );
558          System.exit(1);
559      }
560      try {
561        tag    = _dis.readByte();
562      } catch (EOFException e) {
563        // return quietly
564        _done = true;
565        break;
566      }
567    }
568  }
569 
570 
571  void handleUnloadClass() throws java.io.IOException {
572    int time      = _dis.readInt();
573    int length    = _dis.readInt();
574    int classId   = _dis.readInt();
575 
576    if (MadmapMain.verbose()) {
577      System. out. println ("handleUnloadClass:  0x" + Long.toHexString( classId ));
578    }
579  }
580 
581  void handleStackTrace() throws java.io.IOException {
582    int time        = _dis.readInt();
583    int length      = _dis.readInt();
584    int stackTraceId  = _dis.readInt();
585    int threadId      = _dis.readInt();
586    int numFrames     = _dis.readInt();
587 
588    if (MadmapMain.runDump()) {
589      System. out. println ("stack trace:  0x" + Long.toHexString( stackTraceId ));
590    }
591    for (int i=0; i<numFrames; i++) {
592      long id = getIdentifier();
593    }
594  }
595 
596  void handleStackFrame() throws java.io.IOException {
597    int time        = _dis.readInt();
598    int length      = _dis.readInt();
599    long stackFrameId  = getIdentifier();
600    long methodNameId  = getIdentifier();
601    long methodSigId  = getIdentifier();
602    long sourceFileNameId  = getIdentifier();
603    int classSerialNum  = _dis.readInt();
604    int lineNumber  = _dis.readInt();
605 
606    if (MadmapMain.runDump()) {
607      System. out. println ("stack frame:  0x" + Long.toHexString( stackFrameId ));
608    }
609  }
610  
611  public void go() {
612    try {
613    // File starts with null-terminated "JAVA PROFILE 1.0.1"
614    byte[] rawBytes  = new byte[ 18 ];
615    int bytesRead    = _dis.read( rawBytes );
616     
617    String header     = new String( rawBytes );
618    if ( header.equals ( "JAVA PROFILE 1.0.1" ) || header.equals ( "JAVA PROFILE 1.0.2" )) {
619      
620      // off to a good start!
621      if (MadmapMain.verbose()) {
622        System. out. println ( "Input file " +  _fileName + " seems to be a binary heap dump" );
623      }
624      
625      byte b = _dis.readByte();
626      assert b == 0 : "not null terminated?";
627     
628      _identifierSize = _dis.readInt();     
629      long timeStamp = _dis.readLong();
630      System. out. println ( "Timestamp " +  timeStamp + " = " + (new Date( timeStamp )) + " ID size=" + _identifierSize);
631   
632      while( true && !_done) {
633        int tag    = _dis.readByte();
634        
635        if (MadmapMain.runDump()) {
636          System.out.println ("read: " + tag);
637        }
638        
639        switch ( tag ) {
640          case STRING:
641            handleString();
642            break;
643          case LOAD_CLASS:
644            handleLoadClass();
645            break;
646          case UNLOAD_CLASS:
647            handleUnloadClass();
648            break;
649          case HEAP_DUMP:
650          case HEAP_DUMP_SEGMENT:
651            handleHeapDump();
652            break;
653          case STACK_TRACE:
654            handleStackTrace();
655            break;
656          case STACK_FRAME:
657            handleStackFrame();
658            break;
659          default:
660          
661            System.out.println ("unimplemented tag: " + tag);
662            assert false : "should not reach here";
663        }
664      }
665    } else {
666      System. out. println ( "Input file " +  _fileName + " does not seem to be a binary heap dump" );     
667    }
668   
669    } catch (IOException ioe) {
670      System. out. println ( "Error with data file : Caught " + ioe );
671      ioe.printStackTrace();
672    }
673  }
674 
675  public static void usage() {
676    System.out.println("");
677    System.out.println("Usage: BinaryDumpReader [options] <filename>");
678  }
679 
680/*
681  public static void main( String argv[] ) {
682    String  name        = null;
683    boolean seenFile    = false;
684 
685    for ( int i = 0; i < argv.length; i++ ) {
686      if (argv[ i ].startsWith("-") == false) {
687        if ( seenFile == false ) {
688          name = argv[ i ];
689          seenFile = true;
690        } else {
691          System.out.println( "Unknown:" + argv[ i ] );
692          usage();
693          return;
694        }
695      }
696    }
697   
698    BinaryDumpReader bdr = new BinaryDumpReader( name );
699    bdr.go();
700  }
701*/  
702 
703/*
704  byte  readByte() throws IOException {
705    return _dis.readByte();
706  }
707 
708  char  readChar() throws IOException {
709    return _dis.readChar();
710  }
711 
712  long  readLong() throws IOException {
713    return _dis.readLong();
714  }
715  
716  int   readInt() throws IOException {
717    return _dis.readInt();  
718  }
719 
720  short   readShort() throws IOException {
721    return _dis.readShort();  
722  }
723 
724  float   readFloat() throws IOException {
725    return _dis.readFloat();  
726  }
727 
728  double   readDouble() throws IOException {
729    return _dis.readDouble();  
730  }
731 
732  boolean   readBoolean() throws IOException {
733    return _dis.readBoolean();  
734  }
735*/
736 
737}

[all classes][net.sf.madmap]
EMMA 2.0.5312 (C) Vladimir Roubtsov