#!/usr/bin/env python3 """Одна проверенная live-операция source debugger через sdbgbridge.""" import argparse import json import sys from sdbg.model import DebugMap from sdbg.session import DebugSession, SessionError from sdbg.transport import BridgeError, FileBridge def main(): parser = argparse.ArgumentParser(description=__doc__) parser.add_argument('--build', required=True, help='каталог .sprinter-cc-NAME') parser.add_argument('--ipc', required=True, help='SDBG_IPC_DIR процесса MAME') parser.add_argument('--session', required=True, help='SDBG_SESSION_ID процесса MAME') parser.add_argument('--timeout', type=float, default=5) commands = parser.add_subparsers(dest='command', required=True) commands.add_parser('attach') commands.add_parser('where') step = commands.add_parser('step') step.add_argument('--wait', type=float, default=5) commands.add_parser('continue') commands.add_parser('activate-breakpoints') commands.add_parser('deactivate-breakpoints') line = commands.add_parser('break-line') line.add_argument('file') line.add_argument('line', type=int) line.add_argument('--disabled', action='store_true') function = commands.add_parser('break-function') function.add_argument('name') function.add_argument('--disabled', action='store_true') variable = commands.add_parser('read-variable') variable.add_argument('name') variable.add_argument('--module') args = parser.parse_args() bridge = None try: bridge = FileBridge(args.ipc, args.session, args.timeout) session = DebugSession(DebugMap(args.build), bridge) attached = session.attach() if args.command == 'attach': result = attached elif args.command == 'where': result = session.where() elif args.command == 'break-line': result = session.break_line(args.file, args.line, not args.disabled) elif args.command == 'break-function': result = session.break_function(args.name, not args.disabled) elif args.command == 'activate-breakpoints': result = session.activate_breakpoints() elif args.command == 'deactivate-breakpoints': result = session.deactivate_breakpoints() elif args.command == 'read-variable': result = session.read_variable(args.name, args.module) elif args.command == 'step': bridge.request('step') result = session.where(bridge.wait_stopped(args.wait)) else: result = bridge.request('continue') print(json.dumps(result, ensure_ascii=False, indent=2)) return 0 except (BridgeError, SessionError, ValueError, OSError, KeyError) as error: print('sdbg-session: ' + str(error), file=sys.stderr) return 1 finally: if bridge is not None: bridge.close() if __name__ == '__main__': sys.exit(main())