From 0a4b28d1ccba34883ffad3ee505178aed7a702b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Po=C5=BAniak?= Date: Mon, 6 Mar 2023 13:35:34 +0100 Subject: [PATCH 1/7] Add option to include method modifiers to profiling data --- src/arguments.cpp | 3 +++ src/arguments.h | 4 +++- src/frameName.cpp | 25 +++++++++++++++++++++++++ src/frameName.h | 1 + 4 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/arguments.cpp b/src/arguments.cpp index 507442fae..abecbe80c 100644 --- a/src/arguments.cpp +++ b/src/arguments.cpp @@ -353,6 +353,9 @@ Error Arguments::parse(const char* args) { CASE("meminfolog") _log_meminfo_on_dump = true; + CASE("includemm") + _includemm = true; + DEFAULT() if (_unknown_arg == NULL) _unknown_arg = arg; } diff --git a/src/arguments.h b/src/arguments.h index e5f81cc92..b36a6f31a 100644 --- a/src/arguments.h +++ b/src/arguments.h @@ -157,6 +157,7 @@ class Arguments { bool _sched; bool _live; bool _fdtransfer; + bool _includemm; const char* _fdtransfer_path; int _style; CStack _cstack; @@ -221,7 +222,8 @@ class Arguments { _title(NULL), _minwidth(0), _reverse(false), - _log_meminfo_on_dump(false) { + _log_meminfo_on_dump(false), + _includemm(false) { } ~Arguments(); diff --git a/src/frameName.cpp b/src/frameName.cpp index e6f0ca5b0..6b195989c 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -95,6 +95,7 @@ FrameName::FrameName(Arguments& args, int style, int epoch, Mutex& thread_names_ { // Require printf to use standard C format regardless of system locale _saved_locale = uselocale(newlocale(LC_NUMERIC_MASK, "C", (locale_t)0)); + _includemm = args._includemm; buildFilter(_include, args._buf, args._include); buildFilter(_exclude, args._buf, args._exclude); @@ -168,6 +169,22 @@ void FrameName::javaMethodName(jmethodID method) { char* class_name = NULL; char* method_name = NULL; char* method_sig = NULL; + jint modifiers = 0; + + // Based on: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#:~:text=Table%C2%A04.5.%C2%A0Method%20access%20and%20property%20flags + std::map access_flags; + access_flags[0x0001] = "public"; + access_flags[0x0002] = "private"; + access_flags[0x0004] = "protected"; + access_flags[0x0008] = "static"; + access_flags[0x0010] = "final"; + access_flags[0x0020] = "synchronized"; + access_flags[0x0040] = "bridge"; + access_flags[0x0080] = "varargs"; + access_flags[0x0100] = "native"; + access_flags[0x0400] = "abstract"; + access_flags[0x0800] = "strict"; + access_flags[0x1000] = "synthetic"; jvmtiEnv* jvmti = VM::jvmti(); jvmtiError err; @@ -177,6 +194,14 @@ void FrameName::javaMethodName(jmethodID method) { (err = jvmti->GetClassSignature(method_class, &class_name, NULL)) == 0) { // Trim 'L' and ';' off the class descriptor like 'Ljava/lang/Object;' javaClassName(class_name + 1, strlen(class_name) - 2, _style); + jvmti->GetMethodModifiers(method, &modifiers); + if (_includemm) { + for (std::map::const_iterator iterator = access_flags.begin(); iterator != access_flags.end(); iterator++) { + if (modifiers & iterator->first) { + _str.append(".").append(iterator->second); + } + } + } _str.append(".").append(method_name); if (_style & STYLE_SIGNATURES) { if (_style & STYLE_NO_SEMICOLON) { diff --git a/src/frameName.h b/src/frameName.h index 26d8e837c..e8cea7ad4 100644 --- a/src/frameName.h +++ b/src/frameName.h @@ -75,6 +75,7 @@ class FrameName { Mutex& _thread_names_lock; ThreadMap& _thread_names; locale_t _saved_locale; + bool _includemm; void buildFilter(std::vector& vector, const char* base, int offset); const char* decodeNativeSymbol(const char* name); From b693b5a726b3919959cf62d6f1982c972e07c66e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Po=C5=BAniak?= Date: Mon, 6 Mar 2023 13:39:03 +0100 Subject: [PATCH 2/7] Get method modifiers only when includemm flag provided --- src/frameName.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frameName.cpp b/src/frameName.cpp index 6b195989c..a4abfd7ce 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -194,8 +194,8 @@ void FrameName::javaMethodName(jmethodID method) { (err = jvmti->GetClassSignature(method_class, &class_name, NULL)) == 0) { // Trim 'L' and ';' off the class descriptor like 'Ljava/lang/Object;' javaClassName(class_name + 1, strlen(class_name) - 2, _style); - jvmti->GetMethodModifiers(method, &modifiers); if (_includemm) { + jvmti->GetMethodModifiers(method, &modifiers); for (std::map::const_iterator iterator = access_flags.begin(); iterator != access_flags.end(); iterator++) { if (modifiers & iterator->first) { _str.append(".").append(iterator->second); From 664d04f18da2205b4f34ce422ec144dd2974906e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Po=C5=BAniak?= Date: Tue, 7 Mar 2023 14:49:53 +0100 Subject: [PATCH 3/7] Make access flags variable constant, change its type to vector --- src/frameName.cpp | 24 +++++------------------- src/frameName.h | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/src/frameName.cpp b/src/frameName.cpp index a4abfd7ce..87f578f49 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -96,7 +96,6 @@ FrameName::FrameName(Arguments& args, int style, int epoch, Mutex& thread_names_ // Require printf to use standard C format regardless of system locale _saved_locale = uselocale(newlocale(LC_NUMERIC_MASK, "C", (locale_t)0)); _includemm = args._includemm; - buildFilter(_include, args._buf, args._include); buildFilter(_exclude, args._buf, args._exclude); @@ -171,21 +170,6 @@ void FrameName::javaMethodName(jmethodID method) { char* method_sig = NULL; jint modifiers = 0; - // Based on: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#:~:text=Table%C2%A04.5.%C2%A0Method%20access%20and%20property%20flags - std::map access_flags; - access_flags[0x0001] = "public"; - access_flags[0x0002] = "private"; - access_flags[0x0004] = "protected"; - access_flags[0x0008] = "static"; - access_flags[0x0010] = "final"; - access_flags[0x0020] = "synchronized"; - access_flags[0x0040] = "bridge"; - access_flags[0x0080] = "varargs"; - access_flags[0x0100] = "native"; - access_flags[0x0400] = "abstract"; - access_flags[0x0800] = "strict"; - access_flags[0x1000] = "synthetic"; - jvmtiEnv* jvmti = VM::jvmti(); jvmtiError err; @@ -196,11 +180,13 @@ void FrameName::javaMethodName(jmethodID method) { javaClassName(class_name + 1, strlen(class_name) - 2, _style); if (_includemm) { jvmti->GetMethodModifiers(method, &modifiers); - for (std::map::const_iterator iterator = access_flags.begin(); iterator != access_flags.end(); iterator++) { - if (modifiers & iterator->first) { - _str.append(".").append(iterator->second); + std::string modifiers_to_append = ""; + for (int i=0; i> access_flags = { + std::make_pair(0x0001, "public"), + std::make_pair(0x0002, "private"), + std::make_pair(0x0004, "protected"), + std::make_pair(0x0400, "abstract"), + std::make_pair(0x0008, "static"), + std::make_pair(0x0010, "final"), + std::make_pair(0x0020, "synchronized"), + std::make_pair(0x0100, "native"), + std::make_pair(0x0800, "strict"), + std::make_pair(0x0040, "bridge"), + std::make_pair(0x0080, "varargs"), + std::make_pair(0x1000, "synthetic"), + }; void buildFilter(std::vector& vector, const char* base, int offset); const char* decodeNativeSymbol(const char* name); From 76be7e8c377ede43f9bb0fabb2903f950280e1a7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Po=C5=BAniak?= Date: Thu, 9 Mar 2023 13:10:53 +0100 Subject: [PATCH 4/7] Replace vector of pairs with array of pairs --- src/frameName.cpp | 2 +- src/frameName.h | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/frameName.cpp b/src/frameName.cpp index 87f578f49..02833bdef 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -181,7 +181,7 @@ void FrameName::javaMethodName(jmethodID method) { if (_includemm) { jvmti->GetMethodModifiers(method, &modifiers); std::string modifiers_to_append = ""; - for (int i=0; i> access_flags = { + // Good practice order from: https://checkstyle.sourceforge.io/config_modifier.html#ModifierOrder + const std::pair access_flags [12] = { std::make_pair(0x0001, "public"), std::make_pair(0x0002, "private"), std::make_pair(0x0004, "protected"), From 3b60db24f5825a55f7ad9dd0aa3487049ad3bb77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Po=C5=BAniak?= Date: Thu, 9 Mar 2023 17:13:40 +0100 Subject: [PATCH 5/7] Remove unecessary const variable --- src/frameName.cpp | 2 +- src/frameName.h | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/frameName.cpp b/src/frameName.cpp index 02833bdef..43376c782 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -181,7 +181,7 @@ void FrameName::javaMethodName(jmethodID method) { if (_includemm) { jvmti->GetMethodModifiers(method, &modifiers); std::string modifiers_to_append = ""; - for (int i=0; i access_flags [12] = { From 5e85fe5ae351473b30eeb3e239bad3ac9765ffef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Po=C5=BAniak?= Date: Mon, 13 Mar 2023 13:29:52 +0100 Subject: [PATCH 6/7] Make access_flags static --- src/frameName.cpp | 18 ++++++++++++++++++ src/frameName.h | 16 ---------------- 2 files changed, 18 insertions(+), 16 deletions(-) diff --git a/src/frameName.cpp b/src/frameName.cpp index 43376c782..66a41aabb 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -28,6 +28,24 @@ static inline bool isDigit(char c) { } +// Based on: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#:~:text=Table%C2%A04.5.%C2%A0Method%20access%20and%20property%20flags +// Good practice order from: https://checkstyle.sourceforge.io/config_modifier.html#ModifierOrder +const static std::pair access_flags [12] = { + std::make_pair(0x0001, "public"), + std::make_pair(0x0002, "private"), + std::make_pair(0x0004, "protected"), + std::make_pair(0x0400, "abstract"), + std::make_pair(0x0008, "static"), + std::make_pair(0x0010, "final"), + std::make_pair(0x0020, "synchronized"), + std::make_pair(0x0100, "native"), + std::make_pair(0x0800, "strict"), + std::make_pair(0x0040, "bridge"), + std::make_pair(0x0080, "varargs"), + std::make_pair(0x1000, "synthetic"), +}; + + Matcher::Matcher(const char* pattern) { if (pattern[0] == '*') { _type = MATCH_ENDS_WITH; diff --git a/src/frameName.h b/src/frameName.h index 28b7781f5..e8cea7ad4 100644 --- a/src/frameName.h +++ b/src/frameName.h @@ -76,22 +76,6 @@ class FrameName { ThreadMap& _thread_names; locale_t _saved_locale; bool _includemm; - // Based on: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#:~:text=Table%C2%A04.5.%C2%A0Method%20access%20and%20property%20flags - // Good practice order from: https://checkstyle.sourceforge.io/config_modifier.html#ModifierOrder - const std::pair access_flags [12] = { - std::make_pair(0x0001, "public"), - std::make_pair(0x0002, "private"), - std::make_pair(0x0004, "protected"), - std::make_pair(0x0400, "abstract"), - std::make_pair(0x0008, "static"), - std::make_pair(0x0010, "final"), - std::make_pair(0x0020, "synchronized"), - std::make_pair(0x0100, "native"), - std::make_pair(0x0800, "strict"), - std::make_pair(0x0040, "bridge"), - std::make_pair(0x0080, "varargs"), - std::make_pair(0x1000, "synthetic"), - }; void buildFilter(std::vector& vector, const char* base, int offset); const char* decodeNativeSymbol(const char* name); From b8696a23ba7da780b66c11196599793dd4e37d18 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marcin=20Po=C5=BAniak?= Date: Mon, 13 Mar 2023 13:40:50 +0100 Subject: [PATCH 7/7] Remove constant number from array initialization --- src/frameName.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/frameName.cpp b/src/frameName.cpp index 66a41aabb..8d85d9227 100644 --- a/src/frameName.cpp +++ b/src/frameName.cpp @@ -30,7 +30,7 @@ static inline bool isDigit(char c) { // Based on: https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#:~:text=Table%C2%A04.5.%C2%A0Method%20access%20and%20property%20flags // Good practice order from: https://checkstyle.sourceforge.io/config_modifier.html#ModifierOrder -const static std::pair access_flags [12] = { +const static std::pair access_flags [] = { std::make_pair(0x0001, "public"), std::make_pair(0x0002, "private"), std::make_pair(0x0004, "protected"),