From a38dacc6489ff3c7a0748a01ed7cc2bd0cdaaa7c Mon Sep 17 00:00:00 2001 From: Egor Tensin Date: Sat, 29 May 2021 01:03:28 +0300 Subject: include/pdb/ -> include/winapi/debug/ --- include/winapi/debug/call_stack.hpp | 53 +++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 include/winapi/debug/call_stack.hpp (limited to 'include/winapi/debug/call_stack.hpp') diff --git a/include/winapi/debug/call_stack.hpp b/include/winapi/debug/call_stack.hpp new file mode 100644 index 0000000..30f642c --- /dev/null +++ b/include/winapi/debug/call_stack.hpp @@ -0,0 +1,53 @@ +// Copyright (c) 2020 Egor Tensin +// This file is part of the "winapi-debug" project. +// For details, see https://github.com/egor-tensin/winapi-debug. +// Distributed under the MIT License. + +#pragma once + +#include "address.hpp" +#include "dbghelp.hpp" + +#include + +#include +#include +#include +#include +#include + +namespace pdb { + +class CallStack { +public: + static constexpr std::size_t frames_to_skip = 0; + static constexpr std::size_t frames_to_capture = 62; + + // Imposed by CaptureStackBackTrace: + static constexpr std::size_t max_length = 62; + + static_assert(frames_to_skip + frames_to_capture <= max_length, + "Call stack length is too large"); + + static CallStack capture(); + + using AddressCallback = std::function; + bool for_each_address(const AddressCallback& callback) const; + + static std::string pretty_print_address(const DbgHelp& dbghelp, Address addr); + + void dump(std::ostream& os, const DbgHelp&) const; + + const std::array frames; + const std::size_t length; + + const Address* begin() const { return frames.data(); } + const Address* cbegin() const { return begin(); } + const Address* end() const { return begin() + length; } + const Address* cend() const { return end(); } + +private: + CallStack() = default; +}; + +} // namespace pdb -- cgit v1.3