diff options
Diffstat (limited to 'utils')
-rw-r--r-- | utils/addr2name.cpp | 163 | ||||
-rw-r--r-- | utils/command_line.hpp | 44 | ||||
-rw-r--r-- | utils/enum_symbols.cpp | 94 | ||||
-rw-r--r-- | utils/name2addr.cpp | 96 | ||||
-rw-r--r-- | utils/pdb_descr.hpp | 59 |
5 files changed, 182 insertions, 274 deletions
diff --git a/utils/addr2name.cpp b/utils/addr2name.cpp index 87206f2..fe749b8 100644 --- a/utils/addr2name.cpp +++ b/utils/addr2name.cpp @@ -4,9 +4,8 @@ // Distributed under the MIT License. #include "command_line.hpp" -#include "pdb_descr.hpp" - #include "pdb/all.hpp" +#include "pdb_descr.hpp" #pragma warning(push, 0) #include <boost/program_options.hpp> @@ -18,113 +17,89 @@ #include <string> #include <vector> -namespace -{ - class Addr2Name : public SettingsParser - { - public: - explicit Addr2Name(const std::string& argv0) - : SettingsParser{argv0} - { - visible.add_options() - ("pdb", - boost::program_options::value<std::vector<PDB>>(&pdbs) - ->value_name("ADDR,PATH"), - "load a PDB file") - ("lines,l", - boost::program_options::bool_switch(&lines), - "try to resolve source files & line numbers"); - hidden.add_options() - ("address", - boost::program_options::value<std::vector<pdb::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]... [--] [ADDR]..."; - } - - std::vector<PDB> pdbs; - std::vector<pdb::Address> addresses; - bool lines = false; - }; - - std::string format_symbol(const pdb::Module& module, const pdb::Symbol& symbol) - { - std::ostringstream oss; - oss << module.get_name() << '!' << symbol.get_name(); - const auto displacement = symbol.get_displacement(); - if (displacement) - oss << '+' << pdb::format_address(displacement); - return oss.str(); +namespace { + +class Addr2Name : public SettingsParser { +public: + explicit Addr2Name(const std::string& argv0) : SettingsParser{argv0} { + 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<pdb::Address>>(&addresses)->value_name("ADDR"), + "add an address to resolve"); + positional.add("address", -1); } - std::string format_line_info(const pdb::LineInfo& line_info) - { - std::ostringstream oss; - oss << '[' << line_info.file_path << " @ " << line_info.line_number << ']'; - return oss.str(); + const char* get_short_description() const override { + return "[-h|--help] [--pdb ADDR,PATH]... [--] [ADDR]..."; } - void dump_error(const std::exception& e) - { - std::cerr << "error: " << e.what() << '\n'; - } + std::vector<PDB> pdbs; + std::vector<pdb::Address> addresses; + bool lines = false; +}; + +std::string format_symbol(const pdb::Module& module, const pdb::Symbol& symbol) { + std::ostringstream oss; + oss << module.get_name() << '!' << symbol.get_name(); + const auto displacement = symbol.get_displacement(); + if (displacement) + oss << '+' << pdb::format_address(displacement); + return oss.str(); +} - void resolve_symbol(const pdb::Repo& repo, pdb::Address address, bool lines = false) - { - try - { - const auto symbol = repo.resolve_symbol(address); - const auto& module = repo.module_with_offline_base(symbol.get_offline_base()); - - std::ostringstream msg; - msg << format_symbol(module, symbol); - - if (lines) - { - try - { - const auto line_info = repo.resolve_line(address); - msg << ' ' << format_line_info(line_info); - } - catch (const std::exception& e) - { - dump_error(e); - } - } +std::string format_line_info(const pdb::LineInfo& line_info) { + std::ostringstream oss; + oss << '[' << line_info.file_path << " @ " << line_info.line_number << ']'; + return oss.str(); +} - std::cout << msg.str() << '\n'; - } - catch (const std::exception& e) - { - dump_error(e); - std::cout << pdb::format_address(address) << '\n'; +void dump_error(const std::exception& e) { + std::cerr << "error: " << e.what() << '\n'; +} + +void resolve_symbol(const pdb::Repo& repo, pdb::Address address, bool lines = false) { + try { + const auto symbol = repo.resolve_symbol(address); + const auto& module = repo.module_with_offline_base(symbol.get_offline_base()); + + std::ostringstream msg; + msg << format_symbol(module, symbol); + + if (lines) { + try { + const auto line_info = repo.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 << pdb::format_address(address) << '\n'; } } -int main(int argc, char* argv[]) -{ - try - { +} // namespace + +int main(int argc, char* argv[]) { + try { Addr2Name settings{argv[0]}; - try - { + try { settings.parse(argc, argv); - } - catch (const boost::program_options::error& e) - { + } catch (const boost::program_options::error& e) { settings.usage_error(e); return 1; } - if (settings.exit_with_usage) - { + if (settings.exit_with_usage) { settings.usage(); return 0; } @@ -136,9 +111,7 @@ int main(int argc, char* argv[]) for (const auto& address : settings.addresses) resolve_symbol(repo, address, settings.lines); - } - catch (const std::exception& e) - { + } catch (const std::exception& e) { dump_error(e); return 1; } diff --git a/utils/command_line.hpp b/utils/command_line.hpp index 352c210..c991e4a 100644 --- a/utils/command_line.hpp +++ b/utils/command_line.hpp @@ -15,35 +15,25 @@ #include <ostream> #include <string> -class SettingsParser -{ +class SettingsParser { public: - explicit SettingsParser(const std::string& argv0) - : prog_name{extract_filename(argv0)} - { - visible.add_options() - ("help,h", - "show this message and exit"); + explicit SettingsParser(const std::string& argv0) : prog_name{extract_filename(argv0)} { + visible.add_options()("help,h", "show this message and exit"); } virtual ~SettingsParser() = default; - virtual const char* get_short_description() const - { - return "[--option VALUE]..."; - } + virtual const char* get_short_description() const { return "[--option VALUE]..."; } - virtual void parse(int argc, char* argv[]) - { + virtual void parse(int argc, char* argv[]) { boost::program_options::options_description all; all.add(hidden).add(visible); boost::program_options::variables_map vm; - boost::program_options::store( - boost::program_options::command_line_parser{argc, argv} - .options(all) - .positional(positional) - .run(), - vm); + boost::program_options::store(boost::program_options::command_line_parser{argc, argv} + .options(all) + .positional(positional) + .run(), + vm); if (vm.count("help")) exit_with_usage = true; else @@ -52,13 +42,9 @@ public: bool exit_with_usage = false; - void usage() const - { - std::cout << *this; - } + void usage() const { std::cout << *this; } - void usage_error(const std::exception& e) const - { + void usage_error(const std::exception& e) const { std::cerr << "usage error: " << e.what() << '\n'; std::cerr << *this; } @@ -69,15 +55,13 @@ protected: boost::program_options::positional_options_description positional; private: - static std::string extract_filename(const std::string& path) - { + static std::string extract_filename(const std::string& path) { return boost::filesystem::path{path}.filename().string(); } const std::string prog_name; - friend std::ostream& operator<<(std::ostream& os, const SettingsParser& parser) - { + friend std::ostream& operator<<(std::ostream& os, const SettingsParser& parser) { const auto short_descr = parser.get_short_description(); os << "usage: " << parser.prog_name << ' ' << short_descr << '\n'; os << parser.visible; diff --git a/utils/enum_symbols.cpp b/utils/enum_symbols.cpp index 8fa0960..0759dd6 100644 --- a/utils/enum_symbols.cpp +++ b/utils/enum_symbols.cpp @@ -4,9 +4,8 @@ // Distributed under the MIT License. #include "command_line.hpp" -#include "pdb_descr.hpp" - #include "pdb/all.hpp" +#include "pdb_descr.hpp" #pragma warning(push, 0) #include <boost/program_options.hpp> @@ -17,88 +16,67 @@ #include <string> #include <vector> -namespace -{ - class EnumSymbols : public SettingsParser - { - public: - explicit EnumSymbols(const std::string& argv0) - : SettingsParser{argv0} - { - visible.add_options() - ("pdb", - boost::program_options::value<std::vector<PDB>>(&pdbs) - ->value_name("ADDR,PATH"), - "load a PDB file") - ("functions", - boost::program_options::value<pdb::Symbol::Tag>(&tag) - ->implicit_value(function_tag) - ->zero_tokens(), - "only list functions"); - } +namespace { - const char* get_short_description() const override - { - return "[-h|--help] [--pdb ADDR,PATH]... [--functions]"; - } +class EnumSymbols : public SettingsParser { +public: + explicit EnumSymbols(const std::string& argv0) : SettingsParser{argv0} { + namespace po = boost::program_options; - std::vector<PDB> pdbs; + visible.add_options()( + "pdb", po::value<std::vector<PDB>>(&pdbs)->value_name("ADDR,PATH"), "load a PDB file"); + visible.add_options()( + "functions", + po::value<pdb::Symbol::Tag>(&tag)->implicit_value(function_tag)->zero_tokens(), + "only list functions"); + } - bool type_specified() const - { - return tag != reserved_tag; - } + const char* get_short_description() const override { + return "[-h|--help] [--pdb ADDR,PATH]... [--functions]"; + } - pdb::Symbol::Type get_type() const - { - return static_cast<pdb::Symbol::Type>(tag); - } + std::vector<PDB> pdbs; - private: - static const auto reserved_tag = static_cast<pdb::Symbol::Tag>(pdb::Symbol::Type::RESERVED); - static const auto function_tag = static_cast<pdb::Symbol::Tag>(pdb::Symbol::Type::Function); + bool type_specified() const { return tag != reserved_tag; } - pdb::Symbol::Tag tag = reserved_tag; - }; -} + pdb::Symbol::Type get_type() const { return static_cast<pdb::Symbol::Type>(tag); } + +private: + static const auto reserved_tag = static_cast<pdb::Symbol::Tag>(pdb::Symbol::Type::RESERVED); + static const auto function_tag = static_cast<pdb::Symbol::Tag>(pdb::Symbol::Type::Function); + + pdb::Symbol::Tag tag = reserved_tag; +}; -int main(int argc, char* argv[]) -{ - try - { +} // namespace + +int main(int argc, char* argv[]) { + try { EnumSymbols settings{argv[0]}; - try - { + try { settings.parse(argc, argv); - } - catch (const boost::program_options::error& e) - { + } catch (const boost::program_options::error& e) { settings.usage_error(e); return 1; } - if (settings.exit_with_usage) - { + if (settings.exit_with_usage) { settings.usage(); return 0; } pdb::Repo repo; - for (const auto& pdb : settings.pdbs) - { + for (const auto& pdb : settings.pdbs) { const auto id = repo.add_pdb(pdb.online_base, pdb.path); - repo.enum_symbols(id, [&] (const pdb::Symbol& symbol) - { + repo.enum_symbols(id, [&](const pdb::Symbol& symbol) { if (!settings.type_specified() || settings.get_type() == symbol.get_type()) std::cout << symbol.get_name() << '\n'; }); } - } - catch (const std::exception& e) - { + } catch (const std::exception& e) { std::cerr << "error: " << e.what() << '\n'; return 1; } diff --git a/utils/name2addr.cpp b/utils/name2addr.cpp index 22c637b..f5b3b26 100644 --- a/utils/name2addr.cpp +++ b/utils/name2addr.cpp @@ -4,9 +4,8 @@ // Distributed under the MIT License. #include "command_line.hpp" -#include "pdb_descr.hpp" - #include "pdb/all.hpp" +#include "pdb_descr.hpp" #pragma warning(push, 0) #include <boost/program_options.hpp> @@ -17,74 +16,57 @@ #include <string> #include <vector> -namespace -{ - class Name2Addr : public SettingsParser - { - public: - explicit Name2Addr(const std::string& argv0) - : SettingsParser{argv0} - { - visible.add_options() - ("pdb", - boost::program_options::value<std::vector<PDB>>(&pdbs) - ->value_name("ADDR,PATH"), - "load a PDB file"); - hidden.add_options() - ("name", - boost::program_options::value<std::vector<std::string>>(&names) - ->value_name("NAME"), - "add a name to resolve"); - positional.add("name", -1); - } +namespace { - const char* get_short_description() const override - { - return "[-h|--help] [--pdb ADDR,PATH]... [--] [NAME]..."; - } +class Name2Addr : public SettingsParser { +public: + explicit Name2Addr(const std::string& argv0) : SettingsParser{argv0} { + namespace po = boost::program_options; - std::vector<PDB> pdbs; - std::vector<std::string> names; - }; + visible.add_options()( + "pdb", po::value<std::vector<PDB>>(&pdbs)->value_name("ADDR,PATH"), "load a PDB file"); + hidden.add_options()("name", + po::value<std::vector<std::string>>(&names)->value_name("NAME"), + "add a name to resolve"); + positional.add("name", -1); + } - void dump_error(const std::exception& e) - { - std::cerr << "error: " << e.what() << '\n'; + const char* get_short_description() const override { + return "[-h|--help] [--pdb ADDR,PATH]... [--] [NAME]..."; } - void resolve_symbol(const pdb::Repo& repo, const std::string& name) - { - try - { - const auto address = repo.resolve_symbol(name).get_online_address(); - std::cout << pdb::format_address(address) << '\n'; - } - catch (const std::exception& e) - { - dump_error(e); - std::cout << name << '\n'; - } + std::vector<PDB> pdbs; + std::vector<std::string> names; +}; + +void dump_error(const std::exception& e) { + std::cerr << "error: " << e.what() << '\n'; +} + +void resolve_symbol(const pdb::Repo& repo, const std::string& name) { + try { + const auto address = repo.resolve_symbol(name).get_online_address(); + std::cout << pdb::format_address(address) << '\n'; + } catch (const std::exception& e) { + dump_error(e); + std::cout << name << '\n'; } } -int main(int argc, char* argv[]) -{ - try - { +} // namespace + +int main(int argc, char* argv[]) { + try { Name2Addr settings{argv[0]}; - try - { + try { settings.parse(argc, argv); - } - catch (const boost::program_options::error& e) - { + } catch (const boost::program_options::error& e) { settings.usage_error(e); return 1; } - if (settings.exit_with_usage) - { + if (settings.exit_with_usage) { settings.usage(); return 0; } @@ -96,9 +78,7 @@ int main(int argc, char* argv[]) for (const auto& name : settings.names) resolve_symbol(repo, name); - } - catch (const std::exception& e) - { + } catch (const std::exception& e) { dump_error(e); return 1; } diff --git a/utils/pdb_descr.hpp b/utils/pdb_descr.hpp index cde815a..f2e6f38 100644 --- a/utils/pdb_descr.hpp +++ b/utils/pdb_descr.hpp @@ -15,13 +15,11 @@ #include <string> #include <vector> -struct PDB -{ +struct PDB { pdb::Address online_base; std::string path; - static PDB parse(std::string src) - { + static PDB parse(std::string src) { static constexpr auto sep = ','; const auto sep_pos = src.find(sep); @@ -35,8 +33,7 @@ struct PDB return {online_base, src.substr(sep_pos + 1)}; } - static pdb::Address parse_address(const std::string& src) - { + static pdb::Address parse_address(const std::string& src) { pdb::Address dest; if (!pdb::parse_address(dest, src)) boost::throw_exception(boost::program_options::invalid_option_value{src}); @@ -44,32 +41,28 @@ struct PDB } }; -namespace boost -{ - namespace program_options - { - template <typename charT> - void validate( - boost::any& dest, - const std::vector<std::basic_string<charT>>& src_tokens, - PDB*, - int) - { - validators::check_first_occurrence(dest); - const auto& src_token = validators::get_single_string(src_tokens); - dest = any{PDB::parse(src_token)}; - } +namespace boost { +namespace program_options { - template <typename charT> - void validate( - boost::any& dest, - const std::vector<std::basic_string<charT>>& src_tokens, - pdb::Address*, - int) - { - validators::check_first_occurrence(dest); - const auto& src_token = validators::get_single_string(src_tokens); - dest = any{PDB::parse_address(src_token)}; - } - } +template <typename charT> +void validate(boost::any& dest, + const std::vector<std::basic_string<charT>>& src_tokens, + PDB*, + int) { + validators::check_first_occurrence(dest); + const auto& src_token = validators::get_single_string(src_tokens); + dest = any{PDB::parse(src_token)}; +} + +template <typename charT> +void validate(boost::any& dest, + const std::vector<std::basic_string<charT>>& src_tokens, + pdb::Address*, + int) { + validators::check_first_occurrence(dest); + const auto& src_token = validators::get_single_string(src_tokens); + dest = any{PDB::parse_address(src_token)}; } + +} // namespace program_options +} // namespace boost |