Skip to content

Commit ac9eab3

Browse files
Extend TestStackTraceEvent to include method signature and modifiers checks.
1 parent 5d849ca commit ac9eab3

File tree

2 files changed

+57
-5
lines changed

2 files changed

+57
-5
lines changed

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/code/CodeInfoDecoder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -458,24 +458,24 @@ static void fillSourceFields(FrameInfoQueryResult result) {
458458
VMError.guarantee(methodIndex >= 0 && methodIndex < NonmovableArrays.lengthOf(methodEncodings) / entryBytes);
459459

460460
Pointer p = NonmovableArrays.addressOf(methodEncodings, methodIndex * entryBytes);
461-
int classIndex = readSourceFieldOffset(p, shortClass, classOffset);
461+
int classIndex = readIndex(p, shortClass, classOffset);
462462
Class<?> sourceClass = NonmovableArrays.getObject(CodeInfoAccess.getClasses(info), classIndex);
463-
int methodNameIndex = readSourceFieldOffset(p, shortName, nameOffset);
463+
int methodNameIndex = readIndex(p, shortName, nameOffset);
464464
String sourceMethodName = NonmovableArrays.getObject(CodeInfoAccess.getMemberNames(info), methodNameIndex);
465465

466466
String sourceMethodSignature = CodeInfoEncoder.Encoders.INVALID_METHOD_SIGNATURE;
467467
int sourceSignatureModifiers = CodeInfoEncoder.Encoders.INVALID_METHOD_MODIFIERS;
468468
if (CodeInfoEncoder.shouldEncodeAllMethodMetadata()) {
469-
int sourceSignatureIndex = readSourceFieldOffset(p, shortSignature, signatureOffset);
469+
int sourceSignatureIndex = readIndex(p, shortSignature, signatureOffset);
470470
sourceMethodSignature = NonmovableArrays.getObject(CodeInfoAccess.getOtherStrings(info), sourceSignatureIndex);
471471

472-
sourceSignatureModifiers = readSourceFieldOffset(p, true, modifierOffset);
472+
sourceSignatureModifiers = readIndex(p, true, modifierOffset);
473473
}
474474
result.setSourceFields(sourceClass, sourceMethodName, sourceMethodSignature, sourceSignatureModifiers);
475475
}
476476

477477
@Uninterruptible(reason = CALLED_FROM_UNINTERRUPTIBLE_CODE, mayBeInlined = true)
478-
private static int readSourceFieldOffset(Pointer p, boolean isShort, int offset) {
478+
private static int readIndex(Pointer p, boolean isShort, int offset) {
479479
return isShort ? (p.readShort(offset) & 0xffff) : p.readInt(offset);
480480
}
481481

substratevm/src/com.oracle.svm.test/src/com/oracle/svm/test/jfr/TestStackTraceEvent.java

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,35 @@
2626
package com.oracle.svm.test.jfr;
2727

2828
import static org.junit.Assert.assertEquals;
29+
import static org.junit.Assert.assertFalse;
30+
import static org.junit.Assert.assertNotNull;
31+
import static org.junit.Assert.assertTrue;
2932

33+
import java.util.HashSet;
3034
import java.util.List;
35+
import java.util.Set;
3136

37+
import jdk.jfr.consumer.RecordedThread;
38+
import org.junit.Assert;
3239
import org.junit.Test;
3340

3441
import com.oracle.svm.test.jfr.events.StackTraceEvent;
3542

3643
import jdk.jfr.Recording;
3744
import jdk.jfr.consumer.RecordedEvent;
45+
import jdk.jfr.consumer.RecordedFrame;
46+
import jdk.jfr.consumer.RecordedMethod;
47+
import jdk.jfr.consumer.RecordedStackTrace;
3848

3949
/**
4050
* Test if event ({@link StackTraceEvent}) with stacktrace payload is working.
4151
*/
4252
public class TestStackTraceEvent extends JfrRecordingTest {
53+
54+
private static final JfrSeenMethod junitTest = new JfrSeenMethod("test", "()V", 1);
55+
private static final JfrSeenMethod svmJunitMain = new JfrSeenMethod("main", "([Ljava/lang/String;)V", 9);
56+
private static final JfrSeenMethod javaMainRun = new JfrSeenMethod("doRun", "(ILorg/graalvm/nativeimage/c/type/CCharPointerPointer;)I", 10);
57+
4358
@Test
4459
public void test() throws Throwable {
4560
String[] events = new String[]{StackTraceEvent.class.getName()};
@@ -57,5 +72,42 @@ public void test() throws Throwable {
5772

5873
private static void validateEvents(List<RecordedEvent> events) {
5974
assertEquals(1, events.size());
75+
RecordedEvent event = events.getFirst();
76+
77+
long sampledThreadId = event.<RecordedThread> getValue("eventThread").getJavaThreadId();
78+
assertTrue(sampledThreadId > 0);
79+
80+
RecordedStackTrace stackTrace = event.getStackTrace();
81+
assertNotNull(stackTrace);
82+
83+
List<RecordedFrame> frames = stackTrace.getFrames();
84+
assertFalse(frames.isEmpty());
85+
86+
Set<JfrSeenMethod> seenMethod = new HashSet<>();
87+
for (RecordedFrame frame : frames) {
88+
RecordedMethod method = frame.getMethod();
89+
assertNotNull(method);
90+
91+
String methodName = method.getName();
92+
assertNotNull(methodName);
93+
assertFalse(methodName.isEmpty());
94+
95+
String methodDescriptor = method.getDescriptor();
96+
assertNotNull(methodDescriptor);
97+
assertFalse(methodDescriptor.isEmpty());
98+
99+
int methodModifiers = method.getModifiers();
100+
assertTrue(methodModifiers >= 0);
101+
102+
seenMethod.add(new JfrSeenMethod(methodName, methodDescriptor, methodModifiers));
103+
}
104+
105+
Assert.assertTrue(seenMethod.contains(junitTest));
106+
Assert.assertTrue(seenMethod.contains(javaMainRun));
107+
Assert.assertTrue(seenMethod.contains(svmJunitMain));
108+
}
109+
110+
private record JfrSeenMethod(String name, String descriptor, int modifier) {
111+
60112
}
61113
}

0 commit comments

Comments
 (0)