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 992d5e01273e20f84aaaa5c4440ba83f3b42beca
Author: xuxingliang <xuxingli...@xiaomi.com>
AuthorDate: Thu Sep 5 17:12:34 2024 +0800

    tools/gdb: add `info shm` command
    
    (gdb) info shm
      /var/shm/xms:bq-325-1044165565 memsize: 1536000, paddr: 0x41de3970
      /var/shm/xms:bq-325-2123092606 memsize: 1536000, paddr: 0x41f5a9a8
      /var/shm/xms:fakemq-325-1835096569 memsize: 12, paddr: 0x420d19e0
    (gdb)
    
    Signed-off-by: xuxingliang <xuxingli...@xiaomi.com>
---
 tools/gdb/fs.py | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 66 insertions(+), 2 deletions(-)

diff --git a/tools/gdb/fs.py b/tools/gdb/fs.py
index f00396b6d8..8b2602f8d4 100644
--- a/tools/gdb/fs.py
+++ b/tools/gdb/fs.py
@@ -19,12 +19,12 @@
 ############################################################################
 
 import argparse
+import enum
 
 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")
@@ -33,6 +33,35 @@ CONFIG_FS_BACKTRACE = 
utils.get_symbol_value("CONFIG_FS_BACKTRACE")
 CONFIG_NFILE_DESCRIPTORS_PER_BLOCK = int(
     utils.get_symbol_value("CONFIG_NFILE_DESCRIPTORS_PER_BLOCK")
 )
+CONFIG_FS_SHMFS = utils.get_symbol_value("CONFIG_FS_SHMFS")
+
+
+class InodeType(enum.Enum):
+    # define   FSNODEFLAG_TYPE_PSEUDODIR  0x00000000 /*   Pseudo dir (default) 
  */
+    # define   FSNODEFLAG_TYPE_DRIVER     0x00000001 /*   Character driver     
  */
+    # define   FSNODEFLAG_TYPE_BLOCK      0x00000002 /*   Block driver         
  */
+    # define   FSNODEFLAG_TYPE_MOUNTPT    0x00000003 /*   Mount point          
  */
+    # define   FSNODEFLAG_TYPE_NAMEDSEM   0x00000004 /*   Named semaphore      
  */
+    # define   FSNODEFLAG_TYPE_MQUEUE     0x00000005 /*   Message Queue        
  */
+    # define   FSNODEFLAG_TYPE_SHM        0x00000006 /*   Shared memory region 
  */
+    # define   FSNODEFLAG_TYPE_MTD        0x00000007 /*   Named MTD driver     
  */
+    # define   FSNODEFLAG_TYPE_SOFTLINK   0x00000008 /*   Soft link            
  */
+    # define   FSNODEFLAG_TYPE_SOCKET     0x00000009 /*   Socket               
  */
+    # define   FSNODEFLAG_TYPE_PIPE       0x0000000a /*   Pipe                 
  */
+    # define   FSNODEFLAG_TYPE_NAMEDEVENT 0x0000000b /*   Named event group    
  */
+    PSEUDODIR = 0
+    DRIVER = 1
+    BLOCK = 2
+    MOUNTPT = 3
+    NAMEDSEM = 4
+    MQUEUE = 5
+    SHM = 6
+    MTD = 7
+    SOFTLINK = 8
+    SOCKET = 9
+    PIPE = 10
+    NAMEDEVENT = 11
+    UNKNOWN = 12
 
 
 def get_inode_name(inode):
@@ -55,6 +84,19 @@ def inode_getpath(inode):
     return name
 
 
+def inode_gettype(inode) -> InodeType:
+    if not inode:
+        return InodeType.UNKNOWN
+
+    type = int(inode["i_flags"] & FSNODEFLAG_TYPE_MASK)
+
+    # check if it's a valid type in InodeType
+    if type in [e.value for e in InodeType]:
+        return InodeType(type)
+
+    return InodeType.UNKNOWN
+
+
 def get_file(tcb, fd):
     group = tcb["group"]
     filelist = group["tg_filelist"]
@@ -183,7 +225,7 @@ class Mount(gdb.Command):
         super(Mount, self).__init__("mount", gdb.COMMAND_USER)
 
     def mountpt_filter(self, node, path):
-        if node["i_flags"] & FSNODEFLAG_TYPE_MASK == FSNODEFLAG_TYPE_MOUNTPT:
+        if inode_gettype(node) == InodeType.MOUNTPT:
             statfs = node["u"]["i_mops"]["statfs"]
             funcname = gdb.block_for_pc(int(statfs)).function.print_name
             fstype = funcname.split("_")[0]
@@ -295,9 +337,31 @@ class ForeachInode(gdb.Command):
         self.print_inode_info(arg["root_inode"], 1, "")
 
 
+class InfoShmfs(gdb.Command):
+    """Show share memory usage"""
+
+    def __init__(self):
+        super(InfoShmfs, self).__init__("info shm", gdb.COMMAND_USER)
+
+    def shm_filter(self, node, path):
+        if inode_gettype(node) != InodeType.SHM:
+            return
+
+        obj = node["i_private"].cast(gdb.lookup_type("struct 
shmfs_object_s").pointer())
+        length = obj["length"]
+        paddr = obj["paddr"]
+        print(f"  {path} memsize: {length}, paddr: {paddr}")
+
+    def invoke(self, args, from_tty):
+        foreach_inode(self.shm_filter)
+
+
 Fdinfo()
 
 if not utils.get_symbol_value("CONFIG_DISABLE_MOUNTPOINT"):
     Mount()
 
 ForeachInode()
+
+if CONFIG_FS_SHMFS:
+    InfoShmfs()

Reply via email to