diff --git a/ddprof-lib/src/main/cpp/vmEntry.cpp b/ddprof-lib/src/main/cpp/vmEntry.cpp index 321476279..6fadd6a63 100644 --- a/ddprof-lib/src/main/cpp/vmEntry.cpp +++ b/ddprof-lib/src/main/cpp/vmEntry.cpp @@ -129,7 +129,12 @@ JavaFullVersion JavaVersionAccess::get_java_version(char* prop_value) { if (version.major < 9) { version.major = 9; } - // format is 11.0.17+8 + char* peg_char = strchr(prop_value, '+'); + if (peg_char) { + // terminate before the build specification + *peg_char = '\0'; + } + // format is 11.0.17 // this shortcut for parsing the update version should hold till Java 99 version.update = atoi(prop_value + 5); } diff --git a/ddprof-lib/src/main/cpp/vmStructs.cpp b/ddprof-lib/src/main/cpp/vmStructs.cpp index 1a882b79d..815da2212 100644 --- a/ddprof-lib/src/main/cpp/vmStructs.cpp +++ b/ddprof-lib/src/main/cpp/vmStructs.cpp @@ -240,6 +240,11 @@ void VMStructs::initOffsets() { if (strcmp(field, "_klass_offset") == 0) { _klass_offset_addr = *(int **)(entry + address_offset); } + } else if (strcmp(type, "Thread") == 0) { + // Since JDK 24, _osthread field belongs to Thread rather than JavaThread + if (strcmp(field, "_osthread") == 0) { + _thread_osthread_offset = *(int*)(entry + offset_offset); + } } else if (strcmp(type, "JavaThread") == 0) { if (strcmp(field, "_osthread") == 0) { _thread_osthread_offset = *(int *)(entry + offset_offset); diff --git a/ddprof-lib/src/test/cpp/ddprof_ut.cpp b/ddprof-lib/src/test/cpp/ddprof_ut.cpp index 93cbbe40f..23565f0cf 100644 --- a/ddprof-lib/src/test/cpp/ddprof_ut.cpp +++ b/ddprof-lib/src/test/cpp/ddprof_ut.cpp @@ -235,6 +235,17 @@ EXPECT_EQ(9, hs_version1); } + TEST(JavaVersionAccess, testJavaVersionAccess_hs_24) { + char runtime_prop_value_1[] = "24+36-FR"; + char vm_prop_value_1[] = "24+36-FR"; + + JavaFullVersion java_version1 = JavaVersionAccess::get_java_version(runtime_prop_value_1); + int hs_version1 = JavaVersionAccess::get_hotspot_version(vm_prop_value_1); + EXPECT_EQ(24, java_version1.major); + EXPECT_EQ(0, java_version1.update); + EXPECT_EQ(24, hs_version1); + } + int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();