Workaround for dyninst bug with SIGTRAP (#39)

- on some systems (e.g. OLCF Crusher) it has been noted that dyninst will raise SIGTRAP (or SIGILL if DYNINST_SIGNAL_TRAMPOLINE_SIGILL is set in env)
- this fix adds an environment variable OMNITRACE_IGNORE_DYNINST_TRAMPOLINE which, when on, will try to ignore this

[ROCm/rocprofiler-systems commit: d3c73a5860]
This commit is contained in:
Jonathan R. Madsen
2022-04-05 20:46:17 -05:00
committed by GitHub
parent e7546b201a
commit 44c7c29b54
@@ -384,6 +384,12 @@ configure_settings()
#endif
OMNITRACE_CONDITIONAL_BASIC_PRINT(get_verbose_env() > 0, "configuration complete\n");
auto _ignore_dyninst_trampoline =
tim::get_env("OMNITRACE_IGNORE_DYNINST_TRAMPOLINE", false);
// this is how dyninst looks up the env variable
static auto _dyninst_trampoline_signal =
getenv("DYNINST_SIGNAL_TRAMPOLINE_SIGILL") ? SIGILL : SIGTRAP;
if(_config->get_enable_signal_handler())
{
using signal_settings = tim::signal_settings;
@@ -403,9 +409,33 @@ configure_settings()
auto default_signals = signal_settings::get_default();
for(const auto& itr : default_signals)
signal_settings::enable(itr);
if(_ignore_dyninst_trampoline)
signal_settings::disable(static_cast<sys_signal>(_dyninst_trampoline_signal));
auto enabled_signals = signal_settings::get_enabled();
tim::enable_signal_detection(enabled_signals);
}
if(_ignore_dyninst_trampoline)
{
using signal_handler_t = void (*)(int);
static signal_handler_t _old_handler = nullptr;
static auto _trampoline_handler = [](int _v) {
if(_v == _dyninst_trampoline_signal)
{
auto _info =
::tim::signal_settings::get_info(static_cast<tim::sys_signal>(_v));
OMNITRACE_CONDITIONAL_BASIC_PRINT(
get_verbose_env() > 0 || get_debug_env(),
"signal %s (%i) ignored (OMNITRACE_IGNORE_DYNINST_TRAMPOLINE=ON)",
std::get<0>(_info).c_str(), _v);
if(get_verbose_env() > 1 || get_debug_env())
::tim::print_demangled_backtrace<64>();
if(_old_handler) _old_handler(_v);
}
};
_old_handler = signal(_dyninst_trampoline_signal,
static_cast<signal_handler_t>(_trampoline_handler));
}
}
void