From 43714b2355c96f463d722fdd8403b9a54472fc3c Mon Sep 17 00:00:00 2001 From: Ken Van Hoeylandt Date: Sat, 14 Dec 2024 00:16:42 +0100 Subject: [PATCH] Simplify QR stacktrace (#121) --- Tactility/Source/app/crashdiagnostics/QrUrl.cpp | 11 ++++++++--- TactilityCore/Source/kernel/PanicHandler.cpp | 5 ++++- TactilityCore/Source/kernel/PanicHandler.h | 5 ++++- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/Tactility/Source/app/crashdiagnostics/QrUrl.cpp b/Tactility/Source/app/crashdiagnostics/QrUrl.cpp index 38ed5b8a..5c748adf 100644 --- a/Tactility/Source/app/crashdiagnostics/QrUrl.cpp +++ b/Tactility/Source/app/crashdiagnostics/QrUrl.cpp @@ -14,13 +14,15 @@ std::string getUrlFromCrashData() { for (int i = 0; i < crash_data->callstackLength; ++i) { const CallstackFrame&frame = crash_data->callstack[i]; uint32_t pc = esp_cpu_process_stack_pc(frame.pc); +#if CRASH_DATA_INCLUDES_SP uint32_t sp = frame.sp; +#endif stack_buffer[i * 2] = pc; +#if CRASH_DATA_INCLUDES_SP stack_buffer[(i * 2) + 1] = sp; +#endif } - assert(sizeof(CallstackFrame) == 8); - std::stringstream stream; stream << "https://oops.bytewelder.com?"; @@ -31,8 +33,11 @@ std::string getUrlFromCrashData() { for (int i = crash_data->callstackLength - 1; i >= 0; --i) { uint32_t pc = stack_buffer[(i * 2)]; + stream << std::hex << pc; +#if CRASH_DATA_INCLUDES_SP uint32_t sp = stack_buffer[(i * 2) + 1]; - stream << std::hex << pc << std::hex << sp; + stream << std::hex << sp; +#endif } free(stack_buffer); diff --git a/TactilityCore/Source/kernel/PanicHandler.cpp b/TactilityCore/Source/kernel/PanicHandler.cpp index 65b5fe8e..ab519675 100644 --- a/TactilityCore/Source/kernel/PanicHandler.cpp +++ b/TactilityCore/Source/kernel/PanicHandler.cpp @@ -27,10 +27,11 @@ void __wrap_esp_panic_handler(void* info) { esp_backtrace_get_start(&frame.pc, &frame.sp, &frame.next_pc); crashData.callstack[0].pc = frame.pc; +#if CRASH_DATA_INCLUDES_SP crashData.callstack[0].sp = frame.sp; +#endif crashData.callstackLength++; - uint32_t max_framecount = (1024 - 1) / sizeof(esp_backtrace_frame_t); crashData.callstackCorrupted = !(esp_stack_ptr_is_sane(frame.sp) && (esp_ptr_executable((void *)esp_cpu_process_stack_pc(frame.pc)) || /* Ignore the first corrupted PC in case of InstrFetchProhibited */ @@ -43,7 +44,9 @@ void __wrap_esp_panic_handler(void* info) { ) { if (esp_backtrace_get_next_frame(&frame)) { crashData.callstack[crashData.callstackLength].pc = frame.pc; +#if CRASH_DATA_INCLUDES_SP crashData.callstack[crashData.callstackLength].sp = frame.sp; +#endif crashData.callstackLength++; } else { crashData.callstackCorrupted = true; diff --git a/TactilityCore/Source/kernel/PanicHandler.h b/TactilityCore/Source/kernel/PanicHandler.h index d461a21e..21a54458 100644 --- a/TactilityCore/Source/kernel/PanicHandler.h +++ b/TactilityCore/Source/kernel/PanicHandler.h @@ -4,11 +4,14 @@ #include -#define CRASH_DATA_CALLSTACK_LIMIT 32 // bytes +#define CRASH_DATA_CALLSTACK_LIMIT 64 +#define CRASH_DATA_INCLUDES_SP false struct CallstackFrame { uint32_t pc = 0; +#if CRASH_DATA_INCLUDES_SP uint32_t sp = 0; +#endif }; struct CrashData {