From e5599931c70bb637e6426238479cf524e8229b7a Mon Sep 17 00:00:00 2001 From: kurnevichstanislav Date: Fri, 28 Apr 2023 15:11:09 +0300 Subject: [PATCH] [Sampling profiler] Added the ability to disable segv handler Signed-off-by: kurnevichstanislav --- runtime/signal_handler.cpp | 9 ++++++++- runtime/tooling/sampler/sampling_profiler.h | 11 +++++++++++ runtime/tooling/tools.cpp | 9 +++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/runtime/signal_handler.cpp b/runtime/signal_handler.cpp index 018661480..0106f0ff3 100644 --- a/runtime/signal_handler.cpp +++ b/runtime/signal_handler.cpp @@ -25,6 +25,7 @@ #include "code_info/code_info.h" #include "include/stack_walker.h" #include "tooling/pt_thread_info.h" +#include "tooling/sampler/sampling_profiler.h" #ifdef PANDA_TARGET_AMD64 extern "C" void StackOverflowExceptionEntrypointTrampoline(); @@ -462,12 +463,18 @@ bool DetectSEGVFromSamplingProfilerHandler([[maybe_unused]] int sig, [[maybe_unu auto *mthread = ManagedThread::GetCurrent(); ASSERT(mthread != nullptr); + auto *sampler = Runtime::GetCurrent()->GetTools().GetSamplingProfiler(); auto *sampling_info = mthread->GetPtThreadInfo()->GetSamplingInfo(); - if (sampling_info != nullptr && sampling_info->IsThreadSampling()) { + if (sampler == nullptr || sampling_info == nullptr) { + return false; + } + + if (sampler->IsSegvHandlerEnable() && sampling_info->IsThreadSampling()) { SignalContext signal_context(context); signal_context.SetPC(reinterpret_cast(&SamplerSigSegvHandler)); return true; } + return false; } diff --git a/runtime/tooling/sampler/sampling_profiler.h b/runtime/tooling/sampler/sampling_profiler.h index b565f5a82..e5ab89e3d 100644 --- a/runtime/tooling/sampler/sampling_profiler.h +++ b/runtime/tooling/sampler/sampling_profiler.h @@ -60,6 +60,16 @@ public: sample_interval_ = static_cast(us); } + void SetSegvHandlerStatus(bool segv_handler_status) + { + is_segv_handler_enable_ = segv_handler_status; + } + + bool IsSegvHandlerEnable() const + { + return is_segv_handler_enable_; + } + bool Start(const char *filename); void Stop(); @@ -96,6 +106,7 @@ private: ThreadCommunicator communicator_; std::atomic is_active_ {false}; + bool is_segv_handler_enable_ {true}; PandaSet managed_threads_ GUARDED_BY(managed_threads_lock_); os::memory::Mutex managed_threads_lock_; diff --git a/runtime/tooling/tools.cpp b/runtime/tooling/tools.cpp index d32d85ff5..e97ff666d 100644 --- a/runtime/tooling/tools.cpp +++ b/runtime/tooling/tools.cpp @@ -28,6 +28,15 @@ void Tools::CreateSamplingProfiler() { ASSERT(sampler_ == nullptr); sampler_ = sampler::Sampler::Create(); + + const char *sampler_segv_option = std::getenv("ARK_SAMPLER_DISABLE_SEGV_HANDLER"); + if (sampler_segv_option != nullptr) { + std::string_view option = sampler_segv_option; + if (option == "1" || option == "true" || option == "ON") { + // SEGV handler for sampler is enable by default + sampler_->SetSegvHandlerStatus(false); + } + } } bool Tools::StartSamplingProfiler(const std::string &aspt_filename, uint32_t interval) -- Gitee