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
1 changed files with 56 additions and 36 deletions

View File

@ -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)