aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/utils/addr2name.cpp
diff options
context:
space:
mode:
authorEgor Tensin <egor@tensin.name>2026-06-12 23:49:48 +0200
committerEgor Tensin <egor@tensin.name>2026-06-12 23:49:48 +0200
commitb00525a10746de26040d201fa2ca7fb075d1f83b (patch)
tree5ef06ab9fe9f1e49040a7bb76f74a62acdf4bed5 /utils/addr2name.cpp
parentcmake: move main library code to src/ (diff)
downloadwinapi-debug-b00525a10746de26040d201fa2ca7fb075d1f83b.tar.gz
winapi-debug-b00525a10746de26040d201fa2ca7fb075d1f83b.zip
utils/ -> src/utils/
Diffstat (limited to 'utils/addr2name.cpp')
-rw-r--r--utils/addr2name.cpp119
1 files changed, 0 insertions, 119 deletions
diff --git a/utils/addr2name.cpp b/utils/addr2name.cpp
deleted file mode 100644
index 98b53b9..0000000
--- a/utils/addr2name.cpp
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2017 Egor Tensin <Egor.Tensin@gmail.com>
-// This file is part of the "winapi-debug" project.
-// For details, see https://github.com/egor-tensin/winapi-debug.
-// Distributed under the MIT License.
-
-#include "command_line.hpp"
-#include "pdb_descr.hpp"
-
-#include <winapi/debug.hpp>
-
-#include <boost/program_options.hpp>
-
-#include <exception>
-#include <format>
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <vector>
-
-namespace {
-
-class Addr2Name : public SettingsParser {
-public:
- explicit Addr2Name(int argc, char** argv) : SettingsParser{argc, argv} {
- namespace po = boost::program_options;
-
- visible.add_options()(
- "pdb", po::value<std::vector<PDB>>(&pdbs)->value_name("ADDR,PATH"), "load a PDB file");
- visible.add_options()(
- "lines,l", po::bool_switch(&lines), "try to resolve source files & line numbers");
- hidden.add_options()(
- "address",
- po::value<std::vector<winapi::Address>>(&addresses)->value_name("ADDR"),
- "add an address to resolve");
- positional.add("address", -1);
- }
-
- const char* get_short_description() const override {
- return "[-h|--help] [--pdb ADDR,PATH]... [-l|--lines] [--] [ADDR]...";
- }
-
- std::vector<PDB> pdbs;
- std::vector<winapi::Address> addresses;
- bool lines = false;
-};
-
-std::string format_symbol(const winapi::Module& module, const winapi::Symbol& symbol) {
- const auto symbol_str = std::format("{}!{}", module.get_name(), symbol.get_name());
- const auto displacement = symbol.get_displacement();
- if (!displacement)
- return symbol_str;
- return std::format("{}+{}", symbol_str, winapi::address::format(displacement));
-}
-
-std::string format_line_info(const winapi::LineInfo& line_info) {
- return std::format("[{} @ {}]", line_info.file_path, line_info.line_number);
-}
-
-void dump_error(const std::exception& e) {
- std::cerr << std::format("error: {}\n", e.what());
-}
-
-void resolve_symbol(const winapi::PostMortem& analysis,
- winapi::Address address,
- bool lines = false) {
- try {
- const auto symbol = analysis.resolve_symbol(address);
- const auto& module = analysis.module_with_offline_base(symbol.get_offline_base());
-
- std::ostringstream msg;
- msg << format_symbol(module, symbol);
-
- if (lines) {
- try {
- const auto line_info = analysis.resolve_line(address);
- msg << ' ' << format_line_info(line_info);
- } catch (const std::exception& e) {
- dump_error(e);
- }
- }
-
- std::cout << msg.str() << '\n';
- } catch (const std::exception& e) {
- dump_error(e);
- std::cout << winapi::address::format(address) << '\n';
- }
-}
-
-} // namespace
-
-int main(int argc, char* argv[]) {
- try {
- Addr2Name settings{argc, argv};
-
- try {
- settings.parse(argc, argv);
- } catch (const boost::program_options::error& e) {
- settings.usage_error(e);
- return 1;
- }
-
- if (settings.exit_with_usage) {
- settings.usage();
- return 0;
- }
-
- winapi::PostMortem analysis;
-
- for (const auto& pdb : settings.pdbs)
- analysis.add_pdb(pdb.online_base, pdb.path);
-
- for (const auto& address : settings.addresses)
- resolve_symbol(analysis, address, settings.lines);
- } catch (const std::exception& e) {
- dump_error(e);
- return 1;
- }
- return 0;
-}