Fix JVMTI GetStackTrace bug
GetStackTrace would incorrectly return ERR(ILLEGAL_ARGUMENT) if the
number frames returned was less then the start depth and start depth
was >= 0. This made some legal stack trace calls impossible.
Instead it should have been checking that at least one frame was
retrieved (since otherwise the start-depth was off the stack).
Test: ./test.py --host
Bug: 132196976
Change-Id: I9f959569f90dbb75de0010173b119472a4b5864e
diff --git a/openjdkjvmti/ti_stack.cc b/openjdkjvmti/ti_stack.cc
index 62204c9..75f0556 100644
--- a/openjdkjvmti/ti_stack.cc
+++ b/openjdkjvmti/ti_stack.cc
@@ -232,7 +232,7 @@
size_t index = 0;
};
-jvmtiError StackUtil::GetStackTrace(jvmtiEnv* jvmti_env ATTRIBUTE_UNUSED,
+jvmtiError StackUtil::GetStackTrace(jvmtiEnv* jvmti_env,
jthread java_thread,
jint start_depth,
jint max_frame_count,
@@ -282,7 +282,9 @@
return ERR(THREAD_NOT_ALIVE);
}
*count_ptr = static_cast<jint>(closure.index);
- if (closure.index < static_cast<size_t>(start_depth)) {
+ if (closure.index == 0) {
+ JVMTI_LOG(INFO, jvmti_env) << "The stack is not large enough for a start_depth of "
+ << start_depth << ".";
return ERR(ILLEGAL_ARGUMENT);
}
return ERR(NONE);
diff --git a/test/911-get-stack-trace/expected.txt b/test/911-get-stack-trace/expected.txt
index 3179424..42e8aa7 100644
--- a/test/911-get-stack-trace/expected.txt
+++ b/test/911-get-stack-trace/expected.txt
@@ -55,6 +55,8 @@
bar (IIILart/ControlData;)J 0 26
foo (IIILart/ControlData;)I 0 21
baz (IIILart/ControlData;)Ljava/lang/Object; 8 34
+---------
+ printOrWait (IILart/ControlData;)V 6 41
From bottom
---------
run ()V 0 25
@@ -62,7 +64,7 @@
baz (IIILart/ControlData;)Ljava/lang/Object; 8 34
bar (IIILart/ControlData;)J 0 26
foo (IIILart/ControlData;)I 0 21
- doTest ()V 58 32
+ doTest ()V 61 33
run ()V 0 25
---------
bar (IIILart/ControlData;)J 0 26
@@ -132,6 +134,8 @@
foo (IIILart/ControlData;)I 0 21
baz (IIILart/ControlData;)Ljava/lang/Object; 8 34
bar (IIILart/ControlData;)J 0 26
+---------
+ wait ()V 2 568
From bottom
---------
run ()V 4 28
@@ -169,7 +173,7 @@
baz (IIILart/ControlData;)Ljava/lang/Object; 8 34
bar (IIILart/ControlData;)J 0 26
foo (IIILart/ControlData;)I 0 21
- run ()V 4 61
+ run ()V 4 62
---------
baz (IIILart/ControlData;)Ljava/lang/Object; 2 32
bar (IIILart/ControlData;)J 0 26
@@ -186,7 +190,7 @@
baz (IIILart/ControlData;)Ljava/lang/Object; 8 34
bar (IIILart/ControlData;)J 0 26
foo (IIILart/ControlData;)I 0 21
- run ()V 4 61
+ run ()V 4 62
---------
printOrWait (IILart/ControlData;)V 45 54
baz (IIILart/ControlData;)Ljava/lang/Object; 2 32
@@ -201,13 +205,13 @@
foo (IIILart/ControlData;)I 0 21
From bottom
---------
- run ()V 4 61
+ run ()V 4 62
---------
foo (IIILart/ControlData;)I 0 21
baz (IIILart/ControlData;)Ljava/lang/Object; 8 34
bar (IIILart/ControlData;)J 0 26
foo (IIILart/ControlData;)I 0 21
- run ()V 4 61
+ run ()V 4 62
---------
baz (IIILart/ControlData;)Ljava/lang/Object; 8 34
bar (IIILart/ControlData;)J 0 26
diff --git a/test/911-get-stack-trace/src/art/OtherThread.java b/test/911-get-stack-trace/src/art/OtherThread.java
index 3f5ae59..a513a1b 100644
--- a/test/911-get-stack-trace/src/art/OtherThread.java
+++ b/test/911-get-stack-trace/src/art/OtherThread.java
@@ -38,6 +38,7 @@
PrintThread.print(t, 1, 25);
PrintThread.print(t, 0, 7);
PrintThread.print(t, 2, 7);
+ PrintThread.print(t, 2, 1);
System.out.println("From bottom");
PrintThread.print(t, -1, 25);
diff --git a/test/911-get-stack-trace/src/art/SameThread.java b/test/911-get-stack-trace/src/art/SameThread.java
index c9afad5..c7efd6a 100644
--- a/test/911-get-stack-trace/src/art/SameThread.java
+++ b/test/911-get-stack-trace/src/art/SameThread.java
@@ -26,6 +26,7 @@
Recurse.foo(4, 1, 25, null);
Recurse.foo(4, 0, 5, null);
Recurse.foo(4, 2, 5, null);
+ Recurse.foo(4, 2, 1, null);
System.out.println("From bottom");
Recurse.foo(4, -1, 25, null);