diff options
Diffstat (limited to 'pw_assert_basic/assert_basic.cc')
-rw-r--r-- | pw_assert_basic/assert_basic.cc | 153 |
1 files changed, 8 insertions, 145 deletions
diff --git a/pw_assert_basic/assert_basic.cc b/pw_assert_basic/assert_basic.cc index e6a64f598..72f2e8c82 100644 --- a/pw_assert_basic/assert_basic.cc +++ b/pw_assert_basic/assert_basic.cc @@ -12,155 +12,18 @@ // License for the specific language governing permissions and limitations under // the License. -// This is a very basic direct output log implementation with no buffering. - -//#define PW_LOG_MODULE_NAME "ASRT" -//#include "pw_log/log.h" - -#include "pw_assert_basic/assert_basic.h" - -#include <cstring> - #include "pw_assert/options.h" -#include "pw_preprocessor/util.h" -#include "pw_string/string_builder.h" -#include "pw_sys_io/sys_io.h" - -// If 1, call C's standard abort() function on assert failure. -#ifndef PW_ASSERT_BASIC_ABORT -#define PW_ASSERT_BASIC_ABORT 1 -#endif // PW_ASSERT_BASIC_ABORT - -// TODO(pwbug/17): Expose these through the config system. -#define PW_ASSERT_BASIC_SHOW_BANNER 1 -#define PW_ASSERT_BASIC_USE_COLORS 1 - -// ANSI color constants to control the terminal. Not Windows compatible. -// clang-format off -#if PW_ASSERT_BASIC_USE_COLORS -#define MAGENTA "\033[35m" -#define YELLOW "\033[33m" -#define RED "\033[31m" -#define GREEN "\033[32m" -#define BLUE "\033[96m" -#define BLACK "\033[30m" -#define YELLOW_BG "\033[43m" -#define WHITE_BG "\033[47m" -#define RED_BG "\033[41m" -#define BOLD "\033[1m" -#define RESET "\033[0m" -#else -#define MAGENTA "" -#define YELLOW "" -#define RED "" -#define GREEN "" -#define BLUE "" -#define BLACK "" -#define YELLOW_BG "" -#define WHITE_BG "" -#define RED_BG "" -#define BOLD "" -#define RESET "" -#endif // PW_ASSERT_BASIC_USE_COLORS -// clang-format on - -static const char* kCrashBanner[] = { - " ", - " ▄████▄ ██▀███ ▄▄▄ ██████ ██░ ██ ", - " ▒██▀ ▀█ ▓██ ▒ ██▒ ▒████▄ ▒██ ▒ ▓██░ ██▒ ", - " ▒▓█ 💥 ▄ ▓██ ░▄█ ▒ ▒██ ▀█▄ ░ ▓██▄ ▒██▀▀██░ ", - " ▒▓▓▄ ▄██▒ ▒██▀▀█▄ ░██▄▄▄▄██ ▒ ██▒ ░▓█ ░██ ", - " ▒ ▓███▀ ░ ░██▓ ▒██▒ ▓█ ▓██▒ ▒██████▒▒ ░▓█▒░██▓ ", - " ░ ░▒ ▒ ░ ░ ▒▓ ░▒▓░ ▒▒ ▓▒█░ ▒ ▒▓▒ ▒ ░ ▒ ░░▒░▒ ", - " ░ ▒ ░▒ ░ ▒░ ▒ ▒▒ ░ ░ ░▒ ░ ░ ▒ ░▒░ ░ ", - " ░ ░░ ░ ░ ▒ ░ ░ ░ ░ ░░ ░ ", - " ░ ░ ░ ░ ░ ░ ░ ░ ░ ", - " ░", - " ", -}; - -using pw::sys_io::WriteLine; - -typedef pw::StringBuffer<150> Buffer; - -extern "C" void pw_Crash(const char* file_name, - int line_number, - const char* function_name, - const char* message, - ...) { - // As a matter of usability, crashes should be visible; make it so. -#if PW_ASSERT_BASIC_SHOW_BANNER - WriteLine(RED); - for (const char* line : kCrashBanner) { - WriteLine(line); - } - WriteLine(RESET); -#endif // PW_ASSERT_BASIC_SHOW_BANNER - - WriteLine( - " Welp, that didn't go as planned. " - "It seems we crashed. Terribly sorry!"); - WriteLine(""); - WriteLine(YELLOW " CRASH MESSAGE" RESET); - WriteLine(""); - { - Buffer buffer; - buffer << " "; - va_list args; - va_start(args, message); - buffer.FormatVaList(message, args); - va_end(args); - WriteLine(buffer.view()); - } - - WriteLine(""); - WriteLine(YELLOW " CRASH FILE & LINE" RESET); - WriteLine(""); - { - Buffer buffer; - buffer.Format(" %s:%d", file_name, line_number); - WriteLine(buffer.view()); - } - WriteLine(""); - WriteLine(YELLOW " CRASH FUNCTION" RESET); - WriteLine(""); - { - Buffer buffer; - buffer.Format(" %s", function_name); - WriteLine(buffer.view()); - } - WriteLine(""); - - // TODO(pwbug/95): Perhaps surprisingly, this doesn't actually crash the - // device. At some point we'll have a reboot BSP function or similar, but for - // now this is acceptable since no one is using this basic backend. - if (!PW_ASSERT_BASIC_DISABLE_NORETURN) { - if (PW_ASSERT_BASIC_ABORT) { - abort(); - } else { - WriteLine(MAGENTA " HANG TIME" RESET); - WriteLine(""); - WriteLine( - " ... until a debugger joins. System is waiting in a while(1)"); - while (1) { - } - } - PW_UNREACHABLE; - } else { - WriteLine(MAGENTA " NOTE: YOU ARE IN ASSERT BASIC TEST MODE" RESET); - WriteLine(""); - WriteLine(" This build returns from the crash handler for testing."); - WriteLine(" If you see this message in production, your build is "); - WriteLine(" incorrectly configured. Search for"); - WriteLine(" PW_ASSERT_BASIC_DISABLE_NORETURN to fix it."); - WriteLine(""); - } -} +#include "pw_assert_basic/handler.h" extern "C" void pw_assert_HandleFailure(void) { #if PW_ASSERT_ENABLE_DEBUG - pw_Crash("", 0, "", "Crash: PW_ASSERT() or PW_DASSERT() failure"); + pw_assert_basic_HandleFailure( + nullptr, -1, nullptr, "Crash: PW_ASSERT() or PW_DASSERT() failure"); #else - pw_Crash("", 0, "", "Crash: PW_ASSERT() failure. Note: PW_DASSERT disabled"); + pw_assert_basic_HandleFailure( + nullptr, + -1, + nullptr, + "Crash: PW_ASSERT() failure. Note: PW_DASSERT disabled"); #endif // PW_ASSERT_ENABLE_DEBUG } |