diff --git a/tools/minidumpserver.py b/tools/minidumpserver.py index 82186582a3..0c1441a312 100755 --- a/tools/minidumpserver.py +++ b/tools/minidumpserver.py @@ -20,11 +20,13 @@ import argparse import binascii import logging +import multiprocessing import os import re import shutil import socket import struct +import subprocess import sys import elftools @@ -39,6 +41,9 @@ SHF_ALLOC_EXEC = SHF_ALLOC | SHF_EXEC GDB_SIGNAL_DEFAULT = 7 +DEFAULT_GDB_INIT_CMD = "-ex 'bt full' -ex 'info reg' -ex 'display /40i $pc-40'" + + logger = logging.getLogger() reg_table = { @@ -605,7 +610,26 @@ def arg_parser(): choices=[arch for arch in reg_table.keys()], ) parser.add_argument("-p", "--port", help="gdbport", type=int, default=1234) - parser.add_argument("--debug", action="store_true", default=False) + parser.add_argument( + "-g", + "--gdb", + help="provided a custom GDB path, automatically start GDB session and exit minidumpserver when exit GDB. ", + type=str, + ) + parser.add_argument( + "-i", + "--init-cmd", + nargs="?", + default=argparse.SUPPRESS, + help="provided a custom GDB init command, automatically start GDB sessions and input what you provide. " + f"if you don't provide any command, it will use default command [{DEFAULT_GDB_INIT_CMD}]. ", + ) + parser.add_argument( + "--debug", + action="store_true", + default=False, + help="if enabled, it will show more logs.", + ) return parser.parse_args() @@ -675,9 +699,9 @@ def main(args): config_log(args.debug) - res = auto_parse_log_file(args.logfile) + selected_log = auto_parse_log_file(args.logfile) - log = DumpLogFile(res) + log = DumpLogFile(selected_log) log.parse(args.arch) elf = DumpELFFile(args.elffile) elf.parse() @@ -693,9 +717,34 @@ def main(args): gdbserver.bind(("", args.port)) gdbserver.listen(1) + gdb_exec = "gdb" if not args.gdb else args.gdb + + gdb_init_cmd = "" + if hasattr(args, "init_cmd"): + if args.init_cmd is not None: + gdb_init_cmd = args.init_cmd.strip() + else: + gdb_init_cmd = DEFAULT_GDB_INIT_CMD + + gdb_cmd = ( + f"{gdb_exec} {args.elffile} -ex 'target remote localhost:{args.port}' " + f"{gdb_init_cmd}" + ) logger.info(f"Waiting GDB connection on port {args.port} ...") - logger.info("Press Ctrl+C to stop ...") - logger.info(f'Hint: gdb {args.elffile} -ex "target remote localhost:{args.port}"') + + if not args.gdb: + logger.info("Press Ctrl+C to stop ...") + logger.info(f"Hint: {gdb_cmd}") + else: + logger.info(f"Run GDB command: {gdb_cmd}") + + def gdb_run(cmd): + try: + subprocess.run(cmd, shell=True) + except KeyboardInterrupt: + pass + + multiprocessing.Process(target=gdb_run, args=(gdb_cmd,)).start() while True: try: