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

Reply via email to