From 7149a04002a69deb1d7fed319fbb388f4e8a390d Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Tue, 3 Jan 2017 00:06:20 +0300 Subject: [PATCH] Optimize frame printing --- include/boost/stacktrace/detail/backend.hpp | 1 + .../boost/stacktrace/detail/backend_noop.hpp | 4 ++++ .../boost/stacktrace/detail/backend_posix.hpp | 5 +++++ .../stacktrace/detail/backend_windows.hpp | 19 +++++++++++++++++++ include/boost/stacktrace/frame.hpp | 14 +------------- 5 files changed, 30 insertions(+), 13 deletions(-) diff --git a/include/boost/stacktrace/detail/backend.hpp b/include/boost/stacktrace/detail/backend.hpp index 692dfd8..962fcdb 100644 --- a/include/boost/stacktrace/detail/backend.hpp +++ b/include/boost/stacktrace/detail/backend.hpp @@ -71,6 +71,7 @@ public: BOOST_STACKTRACE_FUNCTION static std::string get_name(const void* addr); BOOST_STACKTRACE_FUNCTION static std::string get_source_file(const void* addr); BOOST_STACKTRACE_FUNCTION static std::size_t get_source_line(const void* addr); + BOOST_STACKTRACE_FUNCTION static std::string to_string(const void* addr); }; }}} // namespace boost::stacktrace::detail diff --git a/include/boost/stacktrace/detail/backend_noop.hpp b/include/boost/stacktrace/detail/backend_noop.hpp index c9db6d4..4cfccce 100644 --- a/include/boost/stacktrace/detail/backend_noop.hpp +++ b/include/boost/stacktrace/detail/backend_noop.hpp @@ -31,6 +31,10 @@ std::size_t backend::get_source_line(const void* /*addr*/) { return 0; } +std::string backend::to_string(const void* /*addr*/) { + return std::string(); +} + }}} // namespace boost::stacktrace::detail #endif // BOOST_STACKTRACE_DETAIL_BACKEND_LIBUNWIND_HPP diff --git a/include/boost/stacktrace/detail/backend_posix.hpp b/include/boost/stacktrace/detail/backend_posix.hpp index ff89066..b0242b6 100644 --- a/include/boost/stacktrace/detail/backend_posix.hpp +++ b/include/boost/stacktrace/detail/backend_posix.hpp @@ -239,6 +239,11 @@ std::size_t backend::get_source_line(const void* addr) { return line_num; } +std::string backend::to_string(const void* addr) { + return get_name(addr) + " at " + addr2line("-Cpe", addr); + //return addr2line("-Cfipe", addr); // Does not seem to work in all cases +} + }}} // namespace boost::stacktrace::detail #endif // BOOST_STACKTRACE_DETAIL_BACKEND_POSIX_HPP diff --git a/include/boost/stacktrace/detail/backend_windows.hpp b/include/boost/stacktrace/detail/backend_windows.hpp index bc7e270..09bb112 100644 --- a/include/boost/stacktrace/detail/backend_windows.hpp +++ b/include/boost/stacktrace/detail/backend_windows.hpp @@ -13,6 +13,7 @@ #endif #include +#include #include #include "Dbgeng.h" @@ -228,6 +229,24 @@ std::size_t backend::get_source_line(const void* addr) { } +std::string backend::to_string(const void* addr) { + com_global_initer com_guard; + com_holder idebug(com_guard); + if (!boost::stacktrace::detail::try_init_com(idebug, com_guard)) { + return std::string(); + } + + std::pair file_line + = boost::stacktrace::detail::get_source_file_line_impl(idebug, addr); + + return boost::stacktrace::detail::get_name_impl(idebug, addr) + + " at " + + file_line.first + + ':' + + boost::lexical_cast(file_line.second) + ; +} + }}} // namespace boost::stacktrace::detail #endif // BOOST_STACKTRACE_DETAIL_BACKEND_LINUX_HPP diff --git a/include/boost/stacktrace/frame.hpp b/include/boost/stacktrace/frame.hpp index 91da0f8..19d1d7e 100644 --- a/include/boost/stacktrace/frame.hpp +++ b/include/boost/stacktrace/frame.hpp @@ -137,19 +137,7 @@ inline std::size_t hash_value(const frame& f) BOOST_NOEXCEPT { /// Outputs stacktrace::frame in a human readable format to output stream; unsafe to use in async handlers. template std::basic_ostream& operator<<(std::basic_ostream& os, const frame& f) { - std::string name = f.name(); - if (!name.empty()) { - os << name; - } else { - os << f.address(); - } - - const std::size_t source_line = f.source_line(); - if (source_line) { - os << " at " << f.source_file() << ':' << source_line; - } - - return os; + return os << boost::stacktrace::detail::backend::to_string(f.address()); } }} // namespace boost::stacktrace