mirror of
https://github.com/apache/nuttx.git
synced 2025-12-16 17:56:38 +08:00
tools/gdb: make entry for list iteration optional
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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"]
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user