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
commit 136b7065b70f0a5e0a47d5f31f1d798148f84ae1 Author: zhengyu9 <zheng...@xiaomi.com> AuthorDate: Wed Aug 14 10:36:34 2024 +0800 gdb tools: print inode info go through each inode and print its structure info in the form like below: ├── i_name: bin, i_ino: 51 │ i_parent: , i_peer: data, i_child: , i_crefs: 1, i_flags: 3 │ ......(other info) │ ├── i_name: audio, i_ino: 5 │ │ i_parent: dev, i_peer: binder, i_child: mixer...... Signed-off-by: zhengyu9 <zheng...@xiaomi.com> --- tools/gdb/fs.py | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++ tools/gdb/lists.py | 8 ++-- 2 files changed, 115 insertions(+), 4 deletions(-) diff --git a/tools/gdb/fs.py b/tools/gdb/fs.py index 9475a9b9e9..2a39a16f23 100644 --- a/tools/gdb/fs.py +++ b/tools/gdb/fs.py @@ -18,14 +18,21 @@ # ############################################################################ +import argparse + import gdb import utils FSNODEFLAG_TYPE_MASK = utils.get_symbol_value("FSNODEFLAG_TYPE_MASK") FSNODEFLAG_TYPE_MOUNTPT = utils.get_symbol_value("FSNODEFLAG_TYPE_MOUNTPT") +CONFIG_PSEUDOFS_FILE = utils.get_symbol_value("CONFIG_PSEUDOFS_FILE") +CONFIG_PSEUDOFS_ATTRIBUTES = utils.get_symbol_value("CONFIG_PSEUDOFS_ATTRIBUTES") + def get_inode_name(inode): + if not inode: + return "" ptr = inode["i_name"].cast(gdb.lookup_type("char").pointer()) return ptr.string() @@ -55,5 +62,109 @@ class Mount(gdb.Command): foreach_inode(self.mountpt_filter) +class ForeachInode(gdb.Command): + """Dump each inode info""" + + def __init__(self): + super(ForeachInode, self).__init__("foreach_inode", gdb.COMMAND_USER) + self.level = 4096 + + def get_root_inode(self, addr_or_expr): + try: + return gdb.Value(int(addr_or_expr, 0)).cast( + gdb.lookup_type("struct inode").pointer() + ) + except ValueError: + return utils.gdb_eval_or_none(addr_or_expr) + + def parse_arguments(self, argv): + parser = argparse.ArgumentParser(description="foreach_inode command") + parser.add_argument( + "-L", + "--level", + type=int, + default=None, + help="Only render the tree to a specific depth", + ) + parser.add_argument( + "addr_or_expr", + type=str, + nargs="?", + default=None, + help="set the start inode to be tranversed", + ) + try: + args = parser.parse_args(argv) + except SystemExit: + return None + return { + "level": args.level if args.level else 4096, + "root_inode": ( + self.get_root_inode(args.addr_or_expr) + if args.addr_or_expr + else utils.gdb_eval_or_none("g_root_inode") + ), + } + + def print_inode_info(self, node, level, prefix): + if level > self.level: + return + while node: + if node["i_peer"]: + initial_indent = prefix + "├── " + subsequent_indent = prefix + "│ " + newprefix = prefix + "│ " + else: + initial_indent = prefix + "└── " + subsequent_indent = prefix + " " + newprefix = prefix + " " + gdb.write( + "%s [%s], %s, %s\n" + % (initial_indent, get_inode_name(node), node["i_ino"], node) + ) + gdb.write( + "%s i_crefs: %s, i_flags: %s, i_private: %s\n" + % ( + subsequent_indent, + node["i_crefs"], + node["i_flags"], + node["i_private"], + ) + ) + if CONFIG_PSEUDOFS_FILE: + gdb.write("%s i_size: %s\n" % (subsequent_indent, node["i_size"])) + if CONFIG_PSEUDOFS_ATTRIBUTES: + gdb.write( + "%s i_mode: %s, i_owner: %s, i_group: %s\n" + % ( + subsequent_indent, + node["i_mode"], + node["i_owner"], + node["i_group"], + ) + ) + gdb.write( + "%s i_atime: %s, i_mtime: %s, i_ctime: %s\n" + % ( + subsequent_indent, + node["i_atime"], + node["i_mtime"], + node["i_ctime"], + ) + ) + if node["i_child"]: + self.print_inode_info(node["i_child"], level + 1, newprefix) + node = node["i_peer"] + + def invoke(self, args, from_tty): + arg = self.parse_arguments(args.split(" ")) + if not arg: + return + self.level = arg["level"] + self.print_inode_info(arg["root_inode"], 1, "") + + if not utils.get_symbol_value("CONFIG_DISABLE_MOUNTPOINT"): Mount() + +ForeachInode() diff --git a/tools/gdb/lists.py b/tools/gdb/lists.py index 8e6674681f..e3384ced0d 100644 --- a/tools/gdb/lists.py +++ b/tools/gdb/lists.py @@ -240,12 +240,12 @@ class ListCheck(gdb.Command): raise gdb.GdbError("Invalid argument type: {}".format(obj.type)) -class ListForEveryEntry(gdb.Command): +class ForeachListEntry(gdb.Command): """Dump list members for a given list""" def __init__(self): - super(ListForEveryEntry, self).__init__( - "list_for_every_entry", gdb.COMMAND_DATA, gdb.COMPLETE_EXPRESSION + super(ForeachListEntry, self).__init__( + "foreach_list_entry", gdb.COMMAND_DATA, gdb.COMPLETE_EXPRESSION ) def invoke(self, arg, from_tty): @@ -268,4 +268,4 @@ class ListForEveryEntry(gdb.Command): ListCheck() -ListForEveryEntry() +ForeachListEntry()