diff --git a/trunk/auto/auto_headers.sh b/trunk/auto/auto_headers.sh index 8ffb16b4e..7f6365d61 100755 --- a/trunk/auto/auto_headers.sh +++ b/trunk/auto/auto_headers.sh @@ -149,6 +149,11 @@ if [[ $SRS_GPERF_CP == YES ]]; then else srs_undefine_macro "SRS_GPERF_CP" $SRS_AUTO_HEADERS_H fi +if [ $SRS_SANITIZER_LOG == YES ]; then + srs_define_macro "SRS_SANITIZER_LOG" $SRS_AUTO_HEADERS_H +else + srs_undefine_macro "SRS_SANITIZER_LOG" $SRS_AUTO_HEADERS_H +fi ##################################################################################### # for embeded. diff --git a/trunk/auto/depends.sh b/trunk/auto/depends.sh index 4125417c7..57596ecbf 100755 --- a/trunk/auto/depends.sh +++ b/trunk/auto/depends.sh @@ -347,6 +347,18 @@ if [[ $SRS_SANITIZER == YES && $OS_IS_X86_64 == YES ]]; then fi fi +if [[ $SRS_SANITIZER == YES && $OS_IS_X86_64 == YES ]]; then + echo "#include " > ${SRS_OBJS}/test_sanitizer.c && + echo "int main() { return 0; }" >> ${SRS_OBJS}/test_sanitizer.c && + gcc -fsanitize=address -fno-omit-frame-pointer -g -O0 ${SRS_OBJS}/test_sanitizer.c \ + -o ${SRS_OBJS}/test_sanitizer 1>/dev/null 2>&1; + ret=$?; rm -rf ${SRS_OBJS}/test_sanitizer* + if [[ $ret -eq 0 ]]; then + echo "libasan api found ok!"; + SRS_SANITIZER_LOG=YES + fi +fi + ##################################################################################### # state-threads ##################################################################################### diff --git a/trunk/auto/options.sh b/trunk/auto/options.sh index 741ac2328..15eb6418c 100755 --- a/trunk/auto/options.sh +++ b/trunk/auto/options.sh @@ -68,6 +68,7 @@ SRS_USE_SYS_SSL=NO # Use system ssl(-lssl) if required. SRS_VALGRIND=NO SRS_SANITIZER=YES SRS_SANITIZER_STATIC=NO +SRS_SANITIZER_LOG=NO SRS_BUILD_TAG= # Set the object files tag name. SRS_CLEAN=YES # Whether do "make clean" when configure. SRS_SIMULATOR=NO # Whether enable RTC simulate API. @@ -161,6 +162,7 @@ Performance: @see https://blog.csdn.net/win_lin/article/details/5 --gprof=on|off Whether build SRS with gprof(GNU profile tool). Default: $(value2switch $SRS_GPROF) --sanitizer=on|off Whether build SRS with address sanitizer. Default: $(value2switch $SRS_SANITIZER) --sanitizer-static=on|off Whether build SRS with static libasan. Default: $(value2switch $SRS_SANITIZER_STATIC) + --sanitizer-log=on|off Whether hijack the log for libasan. Default: $(value2switch $SRS_SANITIZER_LOG) --nasm=on|off Whether build FFMPEG for RTC with nasm. Default: $(value2switch $SRS_NASM) --srtp-nasm=on|off Whether build SRTP with ASM(openssl-asm), requires RTC and openssl-1.0.*. Default: $(value2switch $SRS_SRTP_ASM) @@ -345,6 +347,7 @@ function parse_user_option() { --sanitizer) SRS_SANITIZER=$(switch2value $value) ;; --sanitizer-static) SRS_SANITIZER_STATIC=$(switch2value $value) ;; + --sanitizer-log) SRS_SANITIZER_LOG=$(switch2value $value) ;; --use-sys-ssl) SRS_USE_SYS_SSL=YES ;; --sys-ssl) SRS_USE_SYS_SSL=$(switch2value $value) ;; @@ -620,6 +623,8 @@ function regenerate_options() { SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --debug-stats=$(value2switch $SRS_DEBUG_STATS)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cross-build=$(value2switch $SRS_CROSS_BUILD)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sanitizer=$(value2switch $SRS_SANITIZER)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sanitizer-static=$(value2switch $SRS_SANITIZER_STATIC)" + SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --sanitizer-log=$(value2switch $SRS_SANITIZER_LOG)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --cygwin64=$(value2switch $SRS_CYGWIN64)" SRS_AUTO_CONFIGURE="${SRS_AUTO_CONFIGURE} --single-thread=$(value2switch $SRS_SINGLE_THREAD)" if [[ $SRS_CROSS_BUILD_ARCH != "" ]]; then SRS_AUTO_CONFIGURE="$SRS_AUTO_CONFIGURE --arch=$SRS_CROSS_BUILD_ARCH"; fi diff --git a/trunk/doc/CHANGELOG.md b/trunk/doc/CHANGELOG.md index 50bd60f17..ca01eb61d 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-04, Asan: Set asan loging callback. v5.0.104 * v5.0, 2022-12-02, GB28181: Enable GB for CentOS 7 package. v5.0.103 * v5.0, 2022-12-02, Package script support extra options. v5.0.102 * v5.0, 2022-12-02, Disable CLS and APM by default. v5.0.101 diff --git a/trunk/src/core/srs_core_version5.hpp b/trunk/src/core/srs_core_version5.hpp index 8b6640b90..bf3c9656c 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 103 +#define VERSION_REVISION 104 #endif diff --git a/trunk/src/main/srs_main_server.cpp b/trunk/src/main/srs_main_server.cpp index 6c4b02391..d09ea5f53 100644 --- a/trunk/src/main/srs_main_server.cpp +++ b/trunk/src/main/srs_main_server.cpp @@ -24,6 +24,10 @@ using namespace std; #include #endif +#ifdef SRS_SANITIZER_LOG +#include +#endif + #include using namespace std; @@ -77,6 +81,13 @@ const char* _srs_binary = NULL; // Free global data, for address sanitizer. extern void srs_free_global_system_ips(); +#ifdef SRS_SANITIZER_LOG +void asan_report_callback(const char* str) +{ + srs_trace("%s", str); +} +#endif + /** * main entrance. */ @@ -221,6 +232,10 @@ srs_error_t do_main(int argc, char** argv, char** envp) srs_trace("tcmalloc: set release-rate %.2f=>%.2f", otrr, trr); } #endif + +#ifdef SRS_SANITIZER_LOG + __asan_set_error_report_callback(asan_report_callback); +#endif if ((err = run_directly_or_daemon()) != srs_success) { return srs_error_wrap(err, "run");