summaryrefslogtreecommitdiffstats
path: root/chromium/tools/traceline/traceline/sym_resolver.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/tools/traceline/traceline/sym_resolver.h')
-rw-r--r--chromium/tools/traceline/traceline/sym_resolver.h167
1 files changed, 0 insertions, 167 deletions
diff --git a/chromium/tools/traceline/traceline/sym_resolver.h b/chromium/tools/traceline/traceline/sym_resolver.h
deleted file mode 100644
index eb7e06c08af..00000000000
--- a/chromium/tools/traceline/traceline/sym_resolver.h
+++ /dev/null
@@ -1,167 +0,0 @@
-// Copyright (c) 2009 The Chromium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-// A smaller wrapper around the dbghelp symbol resolution routines.
-// For example:
-// SymResolver resolver("ntdll.dll");
-// resolver.Resolve("ntdll!NtBlahBlah");
-
-#ifndef TRACELINE_SYM_RESOLVER_H_
-#define TRACELINE_SYM_RESOLVER_H_
-
-#include <windows.h>
-#include <dbghelp.h>
-
-#include <vector>
-#include <string>
-#include <map>
-
-static BOOL CALLBACK SymEnumer(PCSTR name, DWORD64 base, PVOID context) {
- reinterpret_cast<std::vector<DWORD64>*>(context)->push_back(base);
- return TRUE;
-}
-
-class SymResolver {
- public:
-
- // Constructor to load a single DLL.
- SymResolver(const char* dllname, HANDLE proc = ::GetCurrentProcess())
- : proc_(proc) {
-
- // TODO(deanm): Would be nice to get this from WinDBG, but it's buried
- // in the workspace data blob... _NT_SYMBOL_PATH is not usually set...
- static char* kSymbolPath =
- "C:\\Program Files\\Debugging Tools for Windows (x86)\\sym;"
- "C:\\Program Files\\Debugging Tools for Windows\\sym";
-
- // If we want to load a specific DLL, or we want to load all.
- if (::SymInitialize(proc_, kSymbolPath, dllname ? FALSE : TRUE) != TRUE) {
- NOTREACHED("SymInitialize failed: %d", GetLastError());
- }
-
- base_ = 0;
-
- if (dllname) {
- base_ = ::SymLoadModuleEx(proc_,
- NULL,
- const_cast<char*>(dllname),
- NULL,
- reinterpret_cast<DWORD64>(
- GetModuleHandleA(dllname)),
- 0,
- NULL,
- 0);
- if (base_ == 0) {
- NOTREACHED("SymLoadModuleEx(%s) failed: %d", dllname, GetLastError());
- }
- }
-
- std::vector<DWORD64> bases;
- // The name returned from SymEnumerateModules64 doesn't include the ext,
- // so we can't differentiate between a dll and exe of the same name. So
- // collect all of the base addresses and query for more info.
- // The prototype changed from PSTR to PCSTR, so in order to support older
- // SDKs we have to cast SymEnumer.
- PSYM_ENUMMODULES_CALLBACK64 enumer =
- reinterpret_cast<PSYM_ENUMMODULES_CALLBACK64>(&SymEnumer);
- if (SymEnumerateModules64(proc_, enumer, &bases) != TRUE) {
- NOTREACHED("SymEnumerateModules64 failed: %d\n", GetLastError());
- }
- for (size_t i = 0; i < bases.size(); ++i) {
- // This was failing, turns out I was just using the system32
- // dbghelp.dll which is old, use the one from windbg :(
- IMAGEHLP_MODULE64 info;
- info.SizeOfStruct = sizeof(info);
- if (SymGetModuleInfo64(proc_, bases[i], &info) != TRUE) {
- NOTREACHED("SymGetModuleInfo64 failed: %d\n", GetLastError());
- }
- std::string filename(info.ImageName);
- size_t last_slash = filename.find_last_of('\\');
- if (last_slash != std::string::npos)
- filename = filename.substr(filename.find_last_of('\\') + 1);
-
- // Map the base address to the image name...
- dlls_[static_cast<int>(bases[i])] = filename;
- }
-
- // TODO(deanm): check the symbols are rad and stuff...
- }
-
- char* Resolve(const char* name) {
- // The API writes to the space after SYMBOL_INFO...
- struct {
- SYMBOL_INFO info;
- char buf[128];
- } info = {0};
-
- info.info.SizeOfStruct = sizeof(info.info);
- info.info.ModBase = base_;
- info.info.MaxNameLen = 127;
-
- if (SymFromName(proc_, const_cast<char*>(name), &info.info) != TRUE) {
- NOTREACHED("SymFromName(%s) failed: %d", name, GetLastError());
- }
-
- return reinterpret_cast<char*>(info.info.Address);
- }
-
- std::string Unresolve(int ptr) {
- // The API writes to the space after SYMBOL_INFO...
- struct {
- SYMBOL_INFO info;
- char buf[128];
- } info = {0};
-
- info.info.SizeOfStruct = sizeof(info.info);
- info.info.ModBase = base_;
- info.info.MaxNameLen = 127;
- if (!::SymFromAddr(proc_, static_cast<DWORD64>(ptr), NULL, &info.info)) {
- return std::string("failed");
- }
-
- std::string name;
- int addr = static_cast<int>(info.info.Address);
- int base = static_cast<int>(info.info.ModBase);
-
- if (dlls_.count(base) == 1) {
- name.append(dlls_[base]);
- } else {
- name.append("unknown_mod");
- }
- name.push_back('!');
- name.append(info.info.Name);
-
- char buf[32];
- _itoa_s(ptr - addr, buf, sizeof(buf), 16);
- name.append("+0x");
- name.append(buf);
-
- DWORD disp;
- IMAGEHLP_LINE64 line;
- if (::SymGetLineFromAddr64(
- proc_, static_cast<DWORD64>(ptr), &disp, &line)) {
- name.append(" [ ");
- name.append(line.FileName);
- name.append(":");
- _itoa_s(line.LineNumber, buf, sizeof(buf), 10);
- name.append(buf);
- name.append(" ]");
- }
-
- return name;
- }
-
- ~SymResolver() {
- if (::SymCleanup(proc_) != TRUE) {
- NOTREACHED("SymCleanup failed: %d", GetLastError());
- }
- }
-
- private:
- HANDLE proc_;
- ULONG64 base_;
- std::map<int, std::string> dlls_;
-};
-
-#endif // TRACELINE_SYM_RESOLVER_H_