/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. * * Copyright 2010-2018 Danny Robson */ #include "backtrace.hpp" #include "debug.hpp" #include "log.hpp" #include "preprocessor.hpp" #include #include using namespace cruft::debug; //////////////////////////////////////////////////////////////////////////////// void cruft::debug::detail::panic (const char *msg) { std::cerr << "PANIC: " << msg << "\n" << ::debug::backtrace () << std::endl; breakpoint (); abort (); } //////////////////////////////////////////////////////////////////////////////// void cruft::debug::detail::not_implemented (const char *msg) { panic (msg); } //----------------------------------------------------------------------------- void cruft::debug::detail::unreachable (const char *msg) { panic (msg); } //////////////////////////////////////////////////////////////////////////////// void warn (void) { warn ("Unusual code path found."); } //----------------------------------------------------------------------------- void warn (const std::string &msg) { warn (msg.c_str ()); } //----------------------------------------------------------------------------- void warn (const char *msg) { LOG_WARN (msg); } //////////////////////////////////////////////////////////////////////////////// static void abort_with_info (void) { LOG_ALERT ("aborting: %!", debug::backtrace {}); } //----------------------------------------------------------------------------- void cruft::debug::init [[gnu::constructor]] (void) { std::set_terminate (abort_with_info); if (!debug_enabled && !getenv ("DEBUG")) return; LOG_DEBUG ("setting debug environment"); //enable_fpe (); force_console (); prepare_debugger (); if (getenv ("DEBUG_WAIT")) await_debugger (); } /////////////////////////////////////////////////////////////////////////////// static void debug_wait [[gnu::constructor]] (void) { if (auto val = getenv ("DEBUG_WAIT")) { LOG_NOTICE ("awaiting debugger"); if (std::string ("0") != val) await_debugger (); } } /////////////////////////////////////////////////////////////////////////////// template <> bool cruft::debug::validator::is_valid (const float &val) noexcept { return !std::isnan (val); } //----------------------------------------------------------------------------- template <> bool cruft::debug::validator::is_valid (const double &val) noexcept { return !std::isnan (val); } /////////////////////////////////////////////////////////////////////////////// #include "std.hpp" //----------------------------------------------------------------------------- #define INSTANTIATE(KLASS) \ template <> \ struct cruft::debug::validator { \ static bool is_valid(KLASS const&); \ }; \ \ bool \ cruft::debug::validator::is_valid(KLASS const&) \ { \ return true; \ } //----------------------------------------------------------------------------- MAP0(INSTANTIATE, u08, u16, u32, u64, i08, i16, i32, i64, char )