This is an automated email from the ASF dual-hosted git repository.

xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/nuttx.git


The following commit(s) were added to refs/heads/master by this push:
     new a104fdc3a5 tools/minudumpserver: support auto start GDB and execute 
some commands
a104fdc3a5 is described below

commit a104fdc3a5cf07bd546407a5d92a7f5d823f6bdb
Author: xinbingnan <[email protected]>
AuthorDate: Tue Sep 12 20:09:08 2023 +0800

    tools/minudumpserver: support auto start GDB and execute some commands
    
    VELAPLATFO-16485
    
    like
    ```bash
    ./nuttx/tools/minidumpserver.py -l log.log -e vela_ap.elf -a arm --gdb 
prebuilts/gcc/linux/arm/bin/arm-none-eabi-gdb -i
    ```
    
    Signed-off-by: xinbingnan <[email protected]>
---
 tools/minidumpserver.py | 59 ++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 54 insertions(+), 5 deletions(-)

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:

Reply via email to