mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
48 lines
1.9 KiB
Python
48 lines
1.9 KiB
Python
import windows
|
|
import windows.generated_def as gdef
|
|
from windows.pycompat import int_types
|
|
|
|
from . import Debugger
|
|
from . import symbols
|
|
|
|
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 |