summaryrefslogtreecommitdiff
path: root/simpleperf/report_utils.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/report_utils.cpp')
-rw-r--r--simpleperf/report_utils.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/simpleperf/report_utils.cpp b/simpleperf/report_utils.cpp
index 74959374..ecbc6aa8 100644
--- a/simpleperf/report_utils.cpp
+++ b/simpleperf/report_utils.cpp
@@ -16,6 +16,9 @@
#include "report_utils.h"
+#include <stdlib.h>
+
+#include <android-base/parsebool.h>
#include <android-base/scopeguard.h>
#include <android-base/strings.h>
@@ -186,6 +189,21 @@ static bool IsArtEntry(const CallChainReportEntry& entry, bool* is_jni_trampolin
return false;
};
+CallChainReportBuilder::CallChainReportBuilder(ThreadTree& thread_tree)
+ : thread_tree_(thread_tree) {
+ const char* env_name = "REMOVE_R8_SYNTHESIZED_FRAME";
+ const char* s = getenv(env_name);
+ if (s != nullptr) {
+ auto result = android::base::ParseBool(s);
+ if (result == android::base::ParseBoolResult::kError) {
+ LOG(WARNING) << "invalid value in env variable " << env_name;
+ } else if (result == android::base::ParseBoolResult::kTrue) {
+ LOG(INFO) << "R8 synthesized frames will be removed.";
+ remove_r8_synthesized_frame_ = true;
+ }
+ }
+}
+
bool CallChainReportBuilder::AddProguardMappingFile(std::string_view mapping_file) {
if (!retrace_) {
retrace_.reset(new ProguardMappingRetrace);
@@ -349,7 +367,7 @@ void CallChainReportBuilder::DeObfuscateJavaMethods(std::vector<CallChainReportE
std::string original_name;
bool synthesized;
if (retrace_->DeObfuscateJavaMethods(name, &original_name, &synthesized)) {
- if (synthesized) {
+ if (synthesized && remove_r8_synthesized_frame_) {
callchain.erase(callchain.begin() + i);
continue;
}