mirror of
https://github.com/boostorg/stacktrace.git
synced 2026-01-21 17:32:15 +00:00
Optimize frame printing
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user