tools/gdb: make entry for list iteration optional

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
This commit is contained in:
xuxingliang
2024-08-27 23:26:15 +08:00
committed by Xiang Xiao
parent 3f3bbf76f9
commit 7b43cf5221
3 changed files with 14 additions and 16 deletions

View File

@@ -121,8 +121,8 @@ def list_check(head):
return
def sq_for_every(sq, entry):
"""Iterate over a singly linked list"""
def sq_for_every(sq, entry=None):
"""Iterate over a singly linked list from the head or specified entry"""
if sq.type == sq_queue_type.pointer():
sq = sq.dereference()
elif sq.type != sq_queue_type:
@@ -132,7 +132,8 @@ def sq_for_every(sq, entry):
if sq["head"] == 0:
return
entry = sq["head"].dereference()
if not entry:
entry = sq["head"].dereference()
while entry.address:
yield entry.address
@@ -177,7 +178,7 @@ def sq_check(sq):
gdb.write("sq_queue is consistent: {} node(s)\n".format(nb))
def dq_for_every(dq, entry):
def dq_for_every(dq, entry=None):
"""Iterate over a doubly linked list"""
if dq.type == dq_queue_type.pointer():
dq = dq.dereference()
@@ -188,7 +189,9 @@ def dq_for_every(dq, entry):
if dq["head"] == 0:
return
entry = dq["head"].dereference()
if not entry:
entry = dq["head"].dereference()
while entry.address:
yield entry.address
entry = entry["flink"].dereference()

View File

@@ -26,7 +26,7 @@ import time
import gdb
import utils
from lists import sq_for_every, sq_queue_type
from lists import sq_for_every
from utils import get_long_type, get_symbol_value, lookup_type, read_ulong
MM_ALLOC_BIT = 0x1
@@ -224,8 +224,7 @@ def mempool_foreach(pool):
yield buf
nblk -= 1
entry = sq_queue_type.pointer()
for entry in sq_for_every(pool["equeue"], entry):
for entry in sq_for_every(pool["equeue"]):
nblk = (pool["expandsize"] - sq_entry_type.sizeof) / blocksize
base = int(entry) - nblk * blocksize
while nblk > 0:
@@ -352,14 +351,12 @@ class Memdump(gdb.Command):
"""Dump the mempool memory"""
for pool in mempool_multiple_foreach(mpool):
if pid == PID_MM_FREE:
entry = sq_queue_type.pointer()
for entry in sq_for_every(pool["queue"], entry):
for entry in sq_for_every(pool["queue"]):
gdb.write("%12u%#*x\n" % (pool["blocksize"], self.align, entry))
self.aordblks += 1
self.uordblks += pool["blocksize"]
for entry in sq_for_every(pool["iqueue"], entry):
for entry in sq_for_every(pool["iqueue"]):
gdb.write("%12u%#*x\n" % (pool["blocksize"], self.align, entry))
self.aordblks += 1
self.uordblks += pool["blocksize"]

View File

@@ -68,9 +68,7 @@ def socket_for_each_entry(proto):
sock_gdbtype = gdb.lookup_type("struct socket_conn_s").pointer()
conn_gdbtype = gdb.lookup_type("struct %s_conn_s" % proto).pointer()
for node in dq_for_every(
gdb.parse_and_eval("g_active_%s_connections" % proto), None
):
for node in dq_for_every(gdb.parse_and_eval("g_active_%s_connections" % proto)):
yield utils.container_of(
utils.container_of(
node, sock_gdbtype, "node"
@@ -86,7 +84,7 @@ def wrbuffer_inqueue_size(queue=None, protocol="tcp"):
total = 0
if queue:
wrb_gdbtype = gdb.lookup_type("struct %s_wrbuffer_s" % protocol).pointer()
for entry in sq_for_every(queue, None):
for entry in sq_for_every(queue):
entry = utils.container_of(entry, wrb_gdbtype, "wb_node")
total += entry["wb_iob"]["io_pktlen"]
return total