From 8f06ce9b3d75e474a47555c896dc14005bc663de Mon Sep 17 00:00:00 2001 From: Antony Polukhin Date: Mon, 2 Jan 2017 21:15:25 +0300 Subject: [PATCH] Preparations for optimized streaming of frames and stacktraces --- .../stacktrace/detail/backend_windows.hpp | 52 ++++++++++++------- 1 file changed, 34 insertions(+), 18 deletions(-) diff --git a/include/boost/stacktrace/detail/backend_windows.hpp b/include/boost/stacktrace/detail/backend_windows.hpp index 025d73f..fd6d9e5 100644 --- a/include/boost/stacktrace/detail/backend_windows.hpp +++ b/include/boost/stacktrace/detail/backend_windows.hpp @@ -103,13 +103,8 @@ std::size_t backend::collect(void** memory, std::size_t size) BOOST_NOEXCEPT { ); } -std::string backend::get_name(const void* addr) { +inline std::string get_name_impl(const com_holder& idebug, const void* addr) { std::string result; - com_global_initer com_guard; - com_holder idebug(com_guard); - if (!try_init_com(idebug, com_guard)) { - return result; - } const ULONG64 offset = reinterpret_cast(addr); char name[256]; @@ -143,21 +138,29 @@ std::string backend::get_name(const void* addr) { return result; } -std::string backend::get_source_file(const void* addr) { - std::string result; + +std::string backend::get_name(const void* addr) { com_global_initer com_guard; com_holder idebug(com_guard); - if (!try_init_com(idebug, com_guard)) { - return result; + if (!boost::stacktrace::detail::try_init_com(idebug, com_guard)) { + return std::string(); } + + return boost::stacktrace::detail::get_name_impl(idebug, addr); +} + + +inline std::pair get_source_file_line_impl(const com_holder& idebug, const void* addr) { + std::pair result; const ULONG64 offset = reinterpret_cast(addr); char name[256]; name[0] = 0; ULONG size = 0; + ULONG line_num = 0; bool res = (S_OK == idebug->GetLineByOffset( offset, - 0, + &line_num, name, sizeof(name), &size, @@ -165,33 +168,46 @@ std::string backend::get_source_file(const void* addr) { )); if (!res && size != 0) { - result.resize(size); + result.first.resize(size); res = (S_OK == idebug->GetLineByOffset( offset, - 0, - &result[0], - static_cast(result.size()), + &line_num, + &result.first[0], + static_cast(result.first.size()), &size, 0 )); } else if (res) { - result = name; + result.first = name; + result.second = line_num; } if (!res) { - result.clear(); + result.first.clear(); + result.second = 0; } return result; } + +std::string backend::get_source_file(const void* addr) { + std::string result; + com_global_initer com_guard; + com_holder idebug(com_guard); + if (!boost::stacktrace::detail::try_init_com(idebug, com_guard)) { + return result; + } + return boost::stacktrace::detail::get_source_file_line_impl(idebug, addr).first; +} + std::size_t backend::get_source_line(const void* addr) { ULONG line_num = 0; com_global_initer com_guard; com_holder idebug(com_guard); - if (!try_init_com(idebug, com_guard)) { + if (!boost::stacktrace::detail::try_init_com(idebug, com_guard)) { return 0; }