gdbserver:skip load symbol if use logfile as input

Signed-off-by: anjiahao <anjiahao@xiaomi.com>
This commit is contained in:
anjiahao
2024-09-02 12:23:39 +08:00
committed by Xiang Xiao
parent ddf44def10
commit 7c37a46f69
+56 -36
View File
@@ -30,6 +30,7 @@ import socket
import struct import struct
import subprocess import subprocess
import sys import sys
import traceback
import elftools import elftools
from elftools.elf.elffile import ELFFile from elftools.elf.elffile import ELFFile
@@ -263,7 +264,7 @@ class DumpELFFile:
self.__xlen = None self.__xlen = None
self.__text = 0 self.__text = 0
def parse(self): def parse(self, load_symbol: bool):
self.__memories = [] self.__memories = []
elf = ELFFile.load_from_path(self.elffile) elf = ELFFile.load_from_path(self.elffile)
self.__arch = elf.get_machine_arch().lower().replace("-", "") self.__arch = elf.get_machine_arch().lower().replace("-", "")
@@ -313,26 +314,27 @@ class DumpELFFile:
if segment.header.p_flags & 1 and not self.__text: if segment.header.p_flags & 1 and not self.__text:
self.__text = segment.header.p_vaddr self.__text = segment.header.p_vaddr
symtab = elf.get_section_by_name(".symtab") self.load_symbol = load_symbol
self.symbol = {} if load_symbol:
for symbol in symtab.iter_symbols(): symtab = elf.get_section_by_name(".symtab")
if symbol["st_info"]["type"] != "STT_OBJECT": self.symbol = {}
continue for symbol in symtab.iter_symbols():
if symbol["st_info"]["type"] != "STT_OBJECT":
continue
if symbol.name in ( if symbol.name in (
"g_tcbinfo", "g_tcbinfo",
"g_pidhash", "g_pidhash",
"g_npidhash", "g_npidhash",
"g_last_regs", "g_last_regs",
"g_running_tasks", "g_running_tasks",
): ):
self.symbol[symbol.name] = symbol self.symbol[symbol.name] = symbol
logger.debug( logger.debug(
f"name:{symbol.name} size:{symbol['st_size']} value:{hex(symbol['st_value'])}" f"name:{symbol.name} size:{symbol['st_size']} value:{hex(symbol['st_value'])}"
) )
elf.close() elf.close()
return True return True
def merge(self, other): def merge(self, other):
@@ -537,25 +539,30 @@ class GDBStub:
self.threadinfo = [] self.threadinfo = []
self.current_thread = 0 self.current_thread = 0
try: if elffile.load_symbol:
self.parse_thread() try:
logger.debug(f"Have {len(self.threadinfo)} threads to debug.") self.parse_thread()
if len(self.threadinfo) == 0: logger.debug(f"Have {len(self.threadinfo)} threads to debug.")
logger.critical( if len(self.threadinfo) == 0:
"Check if your coredump or raw file matches the ELF file" logger.critical(
) "Check if your coredump or raw file matches the ELF file"
sys.exit(1) )
sys.exit(1)
if arch in reg_fix_value.keys(): if arch in reg_fix_value.keys():
self.regfix = True self.regfix = True
logger.info(f"Current arch is {arch}, need reg index fix.") logger.info(f"Current arch is {arch}, need reg index fix.")
except TypeError: except TypeError:
if not self.registers: if not self.registers:
logger.critical( logger.critical(
"Logfile, coredump, or rawfile do not contain register. Please check if the files are correct." "Logfile, coredump, or rawfile do not contain register,"
) "Please check if the files are correct."
sys.exit(1) )
stack_trace = traceback.format_exc()
logger.debug(stack_trace)
sys.exit(1)
def get_gdb_packet(self): def get_gdb_packet(self):
socket = self.socket socket = self.socket
@@ -1017,6 +1024,15 @@ def arg_parser():
help="coredump file, will prase memory in this file", 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( parser.add_argument(
"--debug", "--debug",
action="store_true", action="store_true",
@@ -1101,7 +1117,11 @@ def main(args):
config_log(args.debug) config_log(args.debug)
elf = DumpELFFile(args.elffile[0]) 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()] elf_texts = [elf.text()]
for name in args.elffile[1:]: for name in args.elffile[1:]:
other = DumpELFFile(name) other = DumpELFFile(name)