From 818cc1c495ef6b7fb6f11f97691179a01ecc93d9 Mon Sep 17 00:00:00 2001 From: arvidn Date: Sat, 2 Nov 2019 16:28:46 +0100 Subject: [PATCH] set terminate handler in test framework to print stacktrace if called by test. Install signal handler on windows --- test/main.cpp | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/test/main.cpp b/test/main.cpp index cde3d57f3..f2727b4fb 100644 --- a/test/main.cpp +++ b/test/main.cpp @@ -164,7 +164,7 @@ LONG WINAPI seh_exception_handler(LPEXCEPTION_POINTERS p) exit(code); } -#else +#endif [[noreturn]] void sig_handler(int sig) { @@ -198,15 +198,29 @@ LONG WINAPI seh_exception_handler(LPEXCEPTION_POINTERS p) #endif #undef SIG } - std::printf("signal: (%d) %s caught:\n%s\n" - , sig, name, stack_text); + std::printf("signal: (%d) %s caught:\n%s\n", sig, name, stack_text); output_test_log_to_terminal(); - exit(128 + sig); + std::exit(128 + sig); } -#endif // _WIN32 +[[noreturn]] void term_handler() +{ + char stack_text[10000]; +#if TORRENT_USE_ASSERTS \ + || defined TORRENT_ASIO_DEBUGGING \ + || defined TORRENT_PROFILE_CALLS \ + || defined TORRENT_DEBUG_BUFFERS + print_backtrace(stack_text, sizeof(stack_text), 30); +#elif defined __FUNCTION__ + strcpy(stack_text, __FUNCTION__); +#else + strcpy(stack_text, ""); +#endif + std::printf("\n\nterminate called:\n%s\n\n\n", stack_text); + std::exit(-1); +} void print_usage(char const* executable) { @@ -372,7 +386,9 @@ int EXPORT main(int argc, char const* argv[]) _CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDERR); #endif -#else +#endif + + std::set_terminate(term_handler); signal(SIGSEGV, &sig_handler); #ifdef SIGBUS @@ -386,8 +402,6 @@ int EXPORT main(int argc, char const* argv[]) signal(SIGSYS, &sig_handler); #endif -#endif // _WIN32 - int process_id = -1; #ifdef _WIN32 process_id = _getpid();