// Copyright Antony Polukhin, 2016-2017. // // Distributed under the Boost Software License, Version 1.0. (See // accompanying file LICENSE_1_0.txt or copy at // http://www.boost.org/LICENSE_1_0.txt) #include #include #include #include #include #include #include #ifdef BOOST_STACKTRACE_DYN_LINK # define BOOST_ST_API BOOST_SYMBOL_IMPORT #else # define BOOST_ST_API #endif using boost::stacktrace::stacktrace; typedef std::pair (*foo1_t)(int i); BOOST_ST_API std::pair foo2(int i, foo1_t foo1); BOOST_ST_API stacktrace return_from_nested_namespaces(); BOOST_NOINLINE std::pair foo1(int i) { if (i) { return foo2(i - 1, foo1); } std::pair ret; try { throw std::logic_error("test"); } catch (const std::logic_error& /*e*/) { ret.second = stacktrace(); return ret; } } void main_test_loop() { std::size_t loops = 100; std::size_t Depth = 25; boost::optional > ethalon; std::stringstream ss_ethalon; while (--loops) { std::pair res = foo2(Depth, foo1); if (ethalon) { BOOST_TEST(res == *ethalon); std::stringstream ss; ss << res.first; BOOST_TEST(ss.str() == ss_ethalon.str()); } else { ethalon = res; ss_ethalon << ethalon->first; } } } #if defined(BOOST_STACKTRACE_TEST_COM_PREINIT_MT) || defined(BOOST_STACKTRACE_TEST_COM_PREINIT_ST) # include # include "dbgeng.h" #endif int main() { #if defined(BOOST_STACKTRACE_TEST_COM_PREINIT_MT) ::CoInitializeEx(0, COINIT_MULTITHREADED); #elif defined(BOOST_STACKTRACE_TEST_COM_PREINIT_ST) ::CoInitializeEx(0, COINIT_APARTMENTTHREADED); #endif boost::timer::auto_cpu_timer t; boost::thread t1(main_test_loop); boost::thread t2(main_test_loop); boost::thread t3(main_test_loop); main_test_loop(); t1.join(); t2.join(); t3.join(); #if defined(BOOST_STACKTRACE_TEST_COM_PREINIT_MT) || defined(BOOST_STACKTRACE_TEST_COM_PREINIT_ST) ::CoUninitialize(); #endif return boost::report_errors(); }