Files

68 lines
2.9 KiB
Python

#!/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())