diff --git a/tools/gdbserver.py b/tools/gdbserver.py index edffe841fc..7ff5c8ef22 100755 --- a/tools/gdbserver.py +++ b/tools/gdbserver.py @@ -30,6 +30,7 @@ import socket import struct import subprocess import sys +import traceback import elftools from elftools.elf.elffile import ELFFile @@ -263,7 +264,7 @@ class DumpELFFile: self.__xlen = None self.__text = 0 - def parse(self): + def parse(self, load_symbol: bool): self.__memories = [] elf = ELFFile.load_from_path(self.elffile) self.__arch = elf.get_machine_arch().lower().replace("-", "") @@ -313,26 +314,27 @@ class DumpELFFile: if segment.header.p_flags & 1 and not self.__text: self.__text = segment.header.p_vaddr - symtab = elf.get_section_by_name(".symtab") - self.symbol = {} - for symbol in symtab.iter_symbols(): - if symbol["st_info"]["type"] != "STT_OBJECT": - continue + self.load_symbol = load_symbol + if load_symbol: + symtab = elf.get_section_by_name(".symtab") + self.symbol = {} + for symbol in symtab.iter_symbols(): + if symbol["st_info"]["type"] != "STT_OBJECT": + continue - if symbol.name in ( - "g_tcbinfo", - "g_pidhash", - "g_npidhash", - "g_last_regs", - "g_running_tasks", - ): - self.symbol[symbol.name] = symbol - logger.debug( - f"name:{symbol.name} size:{symbol['st_size']} value:{hex(symbol['st_value'])}" - ) + if symbol.name in ( + "g_tcbinfo", + "g_pidhash", + "g_npidhash", + "g_last_regs", + "g_running_tasks", + ): + self.symbol[symbol.name] = symbol + logger.debug( + f"name:{symbol.name} size:{symbol['st_size']} value:{hex(symbol['st_value'])}" + ) elf.close() - return True def merge(self, other): @@ -537,25 +539,30 @@ class GDBStub: self.threadinfo = [] self.current_thread = 0 - try: - self.parse_thread() - logger.debug(f"Have {len(self.threadinfo)} threads to debug.") - if len(self.threadinfo) == 0: - logger.critical( - "Check if your coredump or raw file matches the ELF file" - ) - sys.exit(1) + if elffile.load_symbol: + try: + self.parse_thread() + logger.debug(f"Have {len(self.threadinfo)} threads to debug.") + if len(self.threadinfo) == 0: + logger.critical( + "Check if your coredump or raw file matches the ELF file" + ) + sys.exit(1) - if arch in reg_fix_value.keys(): - self.regfix = True - logger.info(f"Current arch is {arch}, need reg index fix.") + if arch in reg_fix_value.keys(): + self.regfix = True + logger.info(f"Current arch is {arch}, need reg index fix.") - except TypeError: - if not self.registers: - logger.critical( - "Logfile, coredump, or rawfile do not contain register. Please check if the files are correct." - ) - sys.exit(1) + except TypeError: + if not self.registers: + logger.critical( + "Logfile, coredump, or rawfile do not contain register," + "Please check if the files are correct." + ) + + stack_trace = traceback.format_exc() + logger.debug(stack_trace) + sys.exit(1) def get_gdb_packet(self): socket = self.socket @@ -1017,6 +1024,15 @@ def arg_parser(): help="coredump file, will prase memory in this file", ) + parser.add_argument( + "-s", + "--symbol", + action="store_true", + help="Analyze the symbol table in the ELF file, use in thread awareness" + "if use logfile input, this option will is false by default" + "if use rawfile or coredump input, this option will is true by default", + ) + parser.add_argument( "--debug", action="store_true", @@ -1101,7 +1117,11 @@ def main(args): config_log(args.debug) elf = DumpELFFile(args.elffile[0]) - elf.parse() + if args.symbol is False: + if args.rawfile or args.coredump: + args.symbol = True + + elf.parse(args.symbol) elf_texts = [elf.text()] for name in args.elffile[1:]: other = DumpELFFile(name)