Source code for windows.debug.symboldbg

import windows
import windows.generated_def as gdef
from windows.pycompat import int_types

from . import Debugger
from . import symbols

[docs] class SymbolDebugger(Debugger): """A debugger using the symbol API (hence PDB) for name resolution. To use PDB, a correct version of dbghelp should be configured as well as ``_NT_SYMBOL_PATH``. (See :ref:`debug_symbols_module`) This debugger add a ``current_resolver`` variable (A :class:`~windows.debug.symbols.ProcessSymbolHandler`) for the ``current_process``. """ def __init__(self, *args, **kwargs): super(SymbolDebugger, self).__init__(*args, **kwargs) self._resolvers = {} def _internal_on_load_dll(self, load_dll): path = self._get_loaded_dll(load_dll) # Path is used instead of name for naming the module (and can be set to whatever if using file handle) x = self.current_resolver.load_module(load_dll.hFile, path=path, addr=load_dll.lpBaseOfDll) def _internal_on_create_process(self, create_process): # Create and setup a symbol resolver for the new process resolver = symbols.ProcessSymbolHandler(self.current_process) self._resolvers[self.current_process.pid] = resolver self.current_resolver = resolver def _update_debugger_state(self, debug_event): super(SymbolDebugger, self)._update_debugger_state(debug_event) self.current_resolver = self._resolvers[debug_event.dwProcessId] def _resolve(self, addr, target): if isinstance(addr, int_types): return addr if "+" in addr: symbol, deplacement = addr.split("+", 1) deplacement = int(deplacement, 0) else: symbol = addr deplacement = 0 try: return self.current_resolver[symbol].addr + deplacement except WindowsError as e: if not e.winerror in (gdef.ERROR_NOT_FOUND, gdef.ERROR_MOD_NOT_FOUND): raise return None