diff options
author | Egor Tensin <Egor.Tensin@gmail.com> | 2020-01-15 19:20:50 +0300 |
---|---|---|
committer | Egor Tensin <Egor.Tensin@gmail.com> | 2020-01-16 01:21:32 +0300 |
commit | 3dc0b9a3ae90dcac2f1150e6b2dfb0a5a310355b (patch) | |
tree | fca7da94fdc0f4693a8b49b765738b9e842a1407 /include/pdb | |
parent | lab_rat -> foobar (diff) | |
download | winapi-debug-3dc0b9a3ae90dcac2f1150e6b2dfb0a5a310355b.tar.gz winapi-debug-3dc0b9a3ae90dcac2f1150e6b2dfb0a5a310355b.zip |
add call stack collection support
Diffstat (limited to '')
-rw-r--r-- | include/pdb/all.hpp | 1 | ||||
-rw-r--r-- | include/pdb/call_stack.hpp | 46 | ||||
-rw-r--r-- | include/pdb/dbghelp.hpp | 4 |
3 files changed, 50 insertions, 1 deletions
diff --git a/include/pdb/all.hpp b/include/pdb/all.hpp index 84be09e..36a68d3 100644 --- a/include/pdb/all.hpp +++ b/include/pdb/all.hpp @@ -6,6 +6,7 @@ #pragma once #include "address.hpp" +#include "call_stack.hpp" #include "dbghelp.hpp" #include "error.hpp" #include "handle.hpp" diff --git a/include/pdb/call_stack.hpp b/include/pdb/call_stack.hpp new file mode 100644 index 0000000..7f0c8b0 --- /dev/null +++ b/include/pdb/call_stack.hpp @@ -0,0 +1,46 @@ +// Copyright (c) 2020 Egor Tensin <Egor.Tensin@gmail.com> +// This file is part of the "PDB repository" project. +// For details, see https://github.com/egor-tensin/pdb-repo. +// Distributed under the MIT License. + +#pragma once + +#include "address.hpp" +#include "dbghelp.hpp" + +#include <SafeInt.hpp> + +#include <Windows.h> + +#include <array> +#include <cstddef> +#include <string> + +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(); + + const std::array<Address, max_length> frames; + const std::size_t length; + +private: + CallStack() = default; +}; + +namespace call_stack { + +std::string pretty_print_address(const DbgHelp& dbghelp, Address addr); + +} // namespace call_stack +} // namespace pdb diff --git a/include/pdb/dbghelp.hpp b/include/pdb/dbghelp.hpp index 2809eac..db9638e 100644 --- a/include/pdb/dbghelp.hpp +++ b/include/pdb/dbghelp.hpp @@ -18,7 +18,7 @@ namespace pdb { class DbgHelp { public: - DbgHelp(); + DbgHelp(bool invade_current_process = false); ~DbgHelp(); void close(); @@ -28,6 +28,8 @@ public: typedef std::function<void(const ModuleInfo&)> OnModule; void enum_modules(const OnModule&) const; + ModuleInfo resolve_module(Address) const; + typedef std::function<void(const SymbolInfo&)> OnSymbol; static constexpr auto all_symbols = "*!*"; void enum_symbols(const ModuleInfo&, const std::string& mask, const OnSymbol&) const; |