diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 755df3b0b..b0ffccd1a 100644 --- a/trunk/doc/CHANGELOG.md +++ b/trunk/doc/CHANGELOG.md @@ -8,6 +8,7 @@ The changelog for SRS. ## SRS 5.0 Changelog +* v5.0, 2022-12-18, Merge [#3324](https://github.com/ossrs/srs/pull/3324): Asan: Support parse asan symbol backtrace log. v5.0.113 * v5.0, 2022-12-17, Merge [#3323](https://github.com/ossrs/srs/pull/3323): SRT: Fix srt to rtmp crash when sps or pps empty. v5.0.112 * v5.0, 2022-12-15, For [#3300](https://github.com/ossrs/srs/issues/3300): GB28181: Fix memory overlap for small packets. v5.0.111 * v5.0, 2022-12-14, For [#939](https://github.com/ossrs/srs/issues/939): FLV: Support set default has_av and disable guessing. v5.0.110 diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 11bacc80e..398f122c3 100644 --- a/trunk/src/core/srs_core_version5.hpp +++ b/trunk/src/core/srs_core_version5.hpp @@ -9,6 +9,6 @@ #define VERSION_MAJOR 5 #define VERSION_MINOR 0 -#define VERSION_REVISION 112 +#define VERSION_REVISION 113 #endif diff --git a/trunk/src/kernel/srs_kernel_error.cpp b/trunk/src/kernel/srs_kernel_error.cpp index ab4362eb0..289918a35 100644 --- a/trunk/src/kernel/srs_kernel_error.cpp +++ b/trunk/src/kernel/srs_kernel_error.cpp @@ -7,6 +7,7 @@ #include #include +#include #include #include @@ -15,6 +16,7 @@ #include #include +#include using namespace std; #if defined(SRS_BACKTRACE) && defined(__linux) @@ -118,6 +120,53 @@ char* addr2line_format(void* addr, char* symbol, char* buffer, int nn_buffer) } #endif +int srs_parse_asan_backtrace_symbols(char* symbol, char* out_buf) +{ +#if defined(SRS_BACKTRACE) && defined(__linux) + void* frame = parse_symbol_offset(symbol); + if (!frame) { + return ERROR_BACKTRACE_PARSE_OFFSET; + } + + char* fmt = addr2line_format(frame, symbol, out_buf, sizeof(out_buf)); + if (fmt != out_buf) { + return ERROR_BACKTRACE_ADDR2LINE; + } + + return ERROR_SUCCESS; +#endif + return ERROR_BACKTRACE_PARSE_NOT_SUPPORT; +} + +#ifdef SRS_SANITIZER_LOG +void asan_report_callback(const char* str) +{ + static char buf[256]; + + // No error code for assert failed. + errno = 0; + + std::vector asan_logs = srs_string_split(string(str), "\n"); + size_t log_count = asan_logs.size(); + for (size_t i = 0; i < log_count; i++) { + std::string log = asan_logs[i]; + + if (!srs_string_starts_with(srs_string_trim_start(log, " "), "#")) { + srs_error("%s", log.c_str()); + continue; + } + + buf[0] = 0; + int r0 = srs_parse_asan_backtrace_symbols((char*)log.c_str(), buf); + if (r0 != ERROR_SUCCESS) { + srs_error("%s, r0=%d", log.c_str(), r0); + } else { + srs_error("%s, %s", log.c_str(), buf); + } + } +} +#endif + bool srs_is_system_control_error(srs_error_t err) { int error_code = srs_error_code(err); diff --git a/trunk/src/kernel/srs_kernel_error.hpp b/trunk/src/kernel/srs_kernel_error.hpp index 2e40ee4cd..8c15ce786 100644 --- a/trunk/src/kernel/srs_kernel_error.hpp +++ b/trunk/src/kernel/srs_kernel_error.hpp @@ -102,6 +102,9 @@ XX(ERROR_APM_AUTH , 1089, "ApmAuth", "APM team or token is invalid") \ XX(ERROR_EXPORTER_DISABLED , 1090, "ExporterDisable", "Prometheus exporter is disabled") \ XX(ERROR_ST_SET_SELECT , 1091, "StSetSelect", "ST set select failed") \ + XX(ERROR_BACKTRACE_PARSE_NOT_SUPPORT , 1092, "BacktraceParseNotSupport", "Backtrace parse not supported") \ + XX(ERROR_BACKTRACE_PARSE_OFFSET , 1093, "BacktraceParseOffset", "Parse backtrace offset failed") \ + XX(ERROR_BACKTRACE_ADDR2LINE , 1094, "BacktraceAddr2Line", "Backtrace addr2line failed") \ /**************************************************/ /* RTMP protocol error. */ diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index d09ea5f53..fe1061e72 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -42,6 +42,7 @@ using namespace std; #include #include #include +#include #ifdef SRS_RTC #include @@ -82,10 +83,7 @@ const char* _srs_binary = NULL; extern void srs_free_global_system_ips(); #ifdef SRS_SANITIZER_LOG -void asan_report_callback(const char* str) -{ - srs_trace("%s", str); -} +extern void asan_report_callback(const char* str); #endif /**