Optimize frame printing

This commit is contained in:
Antony Polukhin
2017-01-03 00:06:20 +03:00
parent 898380d622
commit 7149a04002
5 changed files with 30 additions and 13 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -13,6 +13,7 @@
#endif
#include <boost/core/noncopyable.hpp>
#include <boost/lexical_cast.hpp>
#include <windows.h>
#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<IDebugSymbols> idebug(com_guard);
if (!boost::stacktrace::detail::try_init_com(idebug, com_guard)) {
return std::string();
}
std::pair<std::string, std::size_t> 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<std::string>(file_line.second)
;
}
}}} // namespace boost::stacktrace::detail
#endif // BOOST_STACKTRACE_DETAIL_BACKEND_LINUX_HPP

View File

@@ -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 <class CharT, class TraitsT>
std::basic_ostream<CharT, TraitsT>& operator<<(std::basic_ostream<CharT, TraitsT>& 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