68 lines
2.9 KiB
Python
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())
|