37
37
#include " VMHelpers.hpp"
38
38
39
39
J9_DECLARE_CONSTANT_UTF8 (nullString, " (nullString)" );
40
+ J9_DECLARE_CONSTANT_UTF8 (unknownClass, " (defaultPackage)/(unknownClass)" );
41
+ J9_DECLARE_CONSTANT_UTF8 (nativeMethod, " (nativeMethod)" );
42
+ J9_DECLARE_CONSTANT_UTF8 (nativeMethodSignature, " ()" );
40
43
J9_DECLARE_CONSTANT_UTF8 (defaultPackage, " (defaultPackage)" );
41
44
J9_DECLARE_CONSTANT_UTF8 (bootLoaderName, " boostrapClassLoader" );
42
45
46
+ enum JFRStringConstants {
47
+ DefaultString = 0 ,
48
+ UnknownClass = 1 ,
49
+ NativeMethod = 2 ,
50
+ NativeMethodSignature = 3 ,
51
+ };
52
+
43
53
enum FrameType {
44
54
Interpreted = 0 ,
45
55
JIT,
@@ -250,8 +260,14 @@ class VM_JFRConstantPoolTypes {
250
260
/* default values */
251
261
ThreadGroupEntry _defaultThreadGroup;
252
262
StringUTF8Entry _defaultStringUTF8Entry;
263
+ StringUTF8Entry _unknownClassStringUTF8Entry;
264
+ StringUTF8Entry _nativeMethodStringUTF8Entry;
265
+ StringUTF8Entry _nativeMethodSignatureStringUTF8Entry;
253
266
PackageEntry _defaultPackageEntry;
254
267
ModuleEntry _defaultModuleEntry;
268
+ ClassEntry _defaultClassEntry;
269
+ MethodEntry _defaultMethodEntry;
270
+ StackTraceEntry _defaultStackTraceEntry;
255
271
256
272
UDATA _requiredBufferSize;
257
273
U_32 _currentFrameCount;
@@ -336,6 +352,8 @@ class VM_JFRConstantPoolTypes {
336
352
337
353
static UDATA freeUTF8Strings (void *entry, void *userData);
338
354
355
+ static UDATA freeStackStraceEntries (void *entry, void *userData);
356
+
339
357
U_32 getMethodEntry (J9ROMMethod *romMethod, J9Class *ramClass);
340
358
341
359
U_32 getClassEntry (J9Class *clazz);
@@ -381,14 +399,29 @@ class VM_JFRConstantPoolTypes {
381
399
VM_JFRConstantPoolTypes *cp = (VM_JFRConstantPoolTypes*) userData;
382
400
StackFrame *frame = &cp->_currentStackFrameBuffer [cp->_currentFrameCount ];
383
401
384
- if ((UDATA)-1 != bytecodeOffset) {
385
- cp->_currentFrameCount ++;
402
+ cp->_currentFrameCount ++;
386
403
404
+ if ((NULL == ramClass) || (NULL == romMethod)) {
405
+ /* unknown native method */
406
+ frame->methodIndex = 0 ;
407
+ frame->frameType = Native;
408
+ } else {
387
409
frame->methodIndex = cp->getMethodEntry (romMethod, ramClass);
388
- frame->lineNumber = lineNumber;
389
- frame->bytecodeIndex = bytecodeOffset;
390
410
frame->frameType = Interpreted; /* TODO need a way to know if its JIT'ed and inlined */
391
411
}
412
+
413
+ if ((UDATA)-1 == bytecodeOffset) {
414
+ frame->bytecodeIndex = 0 ;
415
+ } else {
416
+ frame->bytecodeIndex = bytecodeOffset;
417
+ }
418
+
419
+ if ((UDATA)-1 == lineNumber) {
420
+ frame->lineNumber = 0 ;
421
+ } else {
422
+ frame->lineNumber = lineNumber;
423
+ }
424
+
392
425
return J9_STACKWALK_KEEP_ITERATING;
393
426
}
394
427
@@ -401,6 +434,9 @@ class VM_JFRConstantPoolTypes {
401
434
goto done;
402
435
}
403
436
_globalStringTable[0 ] = &_defaultStringUTF8Entry;
437
+ _globalStringTable[1 ] = &_unknownClassStringUTF8Entry;
438
+ _globalStringTable[2 ] = &_nativeMethodStringUTF8Entry;
439
+ _globalStringTable[3 ] = &_nativeMethodSignatureStringUTF8Entry;
404
440
_globalStringTable[_stringUTF8Count] = &_defaultPackageEntry;
405
441
406
442
hashTableForEachDo (_stringUTF8Table, &mergeStringUTF8EntriesToGlobalTable, this );
@@ -607,7 +643,16 @@ class VM_JFRConstantPoolTypes {
607
643
608
644
U_32 consumeStackTrace (J9VMThread *walkThread, UDATA *walkStateCache, UDATA numberOfFrames) {
609
645
U_32 index = U_32_MAX;
610
- _currentStackFrameBuffer = (StackFrame*) j9mem_allocate_memory (sizeof (StackFrame) * numberOfFrames, J9MEM_CATEGORY_CLASSES);
646
+ UDATA expandedStackTraceCount = 0 ;
647
+
648
+ if (0 == numberOfFrames) {
649
+ index = 0 ;
650
+ goto done;
651
+ }
652
+
653
+ expandedStackTraceCount = iterateStackTraceImpl (_currentThread, (j9object_t *)walkStateCache, NULL , NULL , FALSE , FALSE , numberOfFrames, FALSE );
654
+
655
+ _currentStackFrameBuffer = (StackFrame*) j9mem_allocate_memory (sizeof (StackFrame) * expandedStackTraceCount, J9MEM_CATEGORY_CLASSES);
611
656
_currentFrameCount = 0 ;
612
657
if (NULL == _currentStackFrameBuffer) {
613
658
_buildResult = OutOfMemory;
@@ -617,7 +662,8 @@ class VM_JFRConstantPoolTypes {
617
662
iterateStackTraceImpl (_currentThread, (j9object_t *)walkStateCache, &stackTraceCallback, this , FALSE , FALSE , numberOfFrames, FALSE );
618
663
619
664
index = addStackTraceEntry (walkThread, VM_JFRUtils::getCurrentTimeNanos (privatePortLibrary, _buildResult), _currentFrameCount);
620
- _stackFrameCount += numberOfFrames;
665
+ _stackFrameCount += expandedStackTraceCount;
666
+ _currentStackFrameBuffer = NULL ;
621
667
622
668
done:
623
669
return index;
@@ -756,28 +802,59 @@ class VM_JFRConstantPoolTypes {
756
802
* For package zero is the deafult package, for Module zero is the unnamed module. ThreadGroup
757
803
* zero is NULL threadGroup.
758
804
*/
759
- _stringUTF8Count++ ;
805
+ _stringUTF8Count += 1 ;
760
806
_defaultStringUTF8Entry = {0 };
761
807
_defaultStringUTF8Entry.string = (J9UTF8*)&nullString;
762
808
763
- _moduleCount++;
809
+ _stringUTF8Count += 1 ;
810
+ _unknownClassStringUTF8Entry = {0 };
811
+ _unknownClassStringUTF8Entry.string = (J9UTF8*)&unknownClass;
812
+
813
+ _stringUTF8Count += 1 ;
814
+ _nativeMethodStringUTF8Entry = {0 };
815
+ _nativeMethodStringUTF8Entry.string = (J9UTF8*)&nativeMethod;
816
+
817
+ _stringUTF8Count += 1 ;
818
+ _nativeMethodSignatureStringUTF8Entry = {0 };
819
+ _nativeMethodSignatureStringUTF8Entry.string = (J9UTF8*)&nativeMethodSignature;
820
+
821
+ _moduleCount += 1 ;
764
822
_defaultModuleEntry = {0 };
765
823
_firstModuleEntry = &_defaultModuleEntry;
766
824
_previousModuleEntry = _firstModuleEntry;
767
825
768
- _packageCount++ ;
826
+ _packageCount += 1 ;
769
827
_defaultPackageEntry = {0 };
770
828
_defaultPackageEntry.exported = TRUE ;
771
829
_defaultPackageEntry.packageName = J9UTF8_DATA ((J9UTF8*) &defaultPackage);
772
830
_defaultPackageEntry.packageNameLength = J9UTF8_LENGTH ((J9UTF8*) &defaultPackage);
773
831
_firstPackageEntry = &_defaultPackageEntry;
774
832
_previousPackageEntry = _firstPackageEntry;
775
833
776
- _threadGroupCount++ ;
834
+ _threadGroupCount += 1 ;
777
835
_defaultThreadGroup = {0 };
778
836
_firstThreadGroupEntry = &_defaultThreadGroup;
779
837
_previousThreadGroupEntry = _firstThreadGroupEntry;
780
838
839
+ _classCount += 1 ;
840
+ _defaultClassEntry = {0 };
841
+ _defaultClassEntry.nameStringUTF8Index = (U_32)UnknownClass;
842
+ _firstClassEntry = &_defaultClassEntry;
843
+ _previousClassEntry = _firstClassEntry;
844
+
845
+ _methodCount += 1 ;
846
+ _defaultMethodEntry = {0 };
847
+ _defaultMethodEntry.nameStringUTF8Index = (U_32)NativeMethod;
848
+ _defaultMethodEntry.descriptorStringUTF8Index = (U_32)NativeMethodSignature;
849
+ /* default class */
850
+ _defaultMethodEntry.classIndex = 0 ;
851
+ _firstMethodEntry = &_defaultMethodEntry;
852
+ _previousMethodEntry = _firstMethodEntry;
853
+
854
+ _stackTraceCount += 1 ;
855
+ _defaultStackTraceEntry = {0 };
856
+ _firstStackTraceEntry = &_defaultStackTraceEntry;
857
+ _previousStackTraceEntry = _firstStackTraceEntry;
781
858
782
859
done:
783
860
return ;
@@ -786,6 +863,7 @@ class VM_JFRConstantPoolTypes {
786
863
~VM_JFRConstantPoolTypes ()
787
864
{
788
865
hashTableForEachDo (_stringUTF8Table, &freeUTF8Strings, _currentThread);
866
+ hashTableForEachDo (_stackTraceTable, &freeStackStraceEntries, _currentThread);
789
867
hashTableFree (_classTable);
790
868
hashTableFree (_packageTable);
791
869
hashTableFree (_moduleTable);
0 commit comments