mirror of
https://github.com/apache/nuttx.git
synced 2026-05-28 11:56:10 +08:00
tools/gdb: make entry for list iteration optional
Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
This commit is contained in:
+8
-5
@@ -121,8 +121,8 @@ def list_check(head):
|
|||||||
return
|
return
|
||||||
|
|
||||||
|
|
||||||
def sq_for_every(sq, entry):
|
def sq_for_every(sq, entry=None):
|
||||||
"""Iterate over a singly linked list"""
|
"""Iterate over a singly linked list from the head or specified entry"""
|
||||||
if sq.type == sq_queue_type.pointer():
|
if sq.type == sq_queue_type.pointer():
|
||||||
sq = sq.dereference()
|
sq = sq.dereference()
|
||||||
elif sq.type != sq_queue_type:
|
elif sq.type != sq_queue_type:
|
||||||
@@ -132,7 +132,8 @@ def sq_for_every(sq, entry):
|
|||||||
if sq["head"] == 0:
|
if sq["head"] == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
entry = sq["head"].dereference()
|
if not entry:
|
||||||
|
entry = sq["head"].dereference()
|
||||||
|
|
||||||
while entry.address:
|
while entry.address:
|
||||||
yield entry.address
|
yield entry.address
|
||||||
@@ -177,7 +178,7 @@ def sq_check(sq):
|
|||||||
gdb.write("sq_queue is consistent: {} node(s)\n".format(nb))
|
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"""
|
"""Iterate over a doubly linked list"""
|
||||||
if dq.type == dq_queue_type.pointer():
|
if dq.type == dq_queue_type.pointer():
|
||||||
dq = dq.dereference()
|
dq = dq.dereference()
|
||||||
@@ -188,7 +189,9 @@ def dq_for_every(dq, entry):
|
|||||||
if dq["head"] == 0:
|
if dq["head"] == 0:
|
||||||
return
|
return
|
||||||
|
|
||||||
entry = dq["head"].dereference()
|
if not entry:
|
||||||
|
entry = dq["head"].dereference()
|
||||||
|
|
||||||
while entry.address:
|
while entry.address:
|
||||||
yield entry.address
|
yield entry.address
|
||||||
entry = entry["flink"].dereference()
|
entry = entry["flink"].dereference()
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ import time
|
|||||||
|
|
||||||
import gdb
|
import gdb
|
||||||
import utils
|
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
|
from utils import get_long_type, get_symbol_value, lookup_type, read_ulong
|
||||||
|
|
||||||
MM_ALLOC_BIT = 0x1
|
MM_ALLOC_BIT = 0x1
|
||||||
@@ -224,8 +224,7 @@ def mempool_foreach(pool):
|
|||||||
yield buf
|
yield buf
|
||||||
nblk -= 1
|
nblk -= 1
|
||||||
|
|
||||||
entry = sq_queue_type.pointer()
|
for entry in sq_for_every(pool["equeue"]):
|
||||||
for entry in sq_for_every(pool["equeue"], entry):
|
|
||||||
nblk = (pool["expandsize"] - sq_entry_type.sizeof) / blocksize
|
nblk = (pool["expandsize"] - sq_entry_type.sizeof) / blocksize
|
||||||
base = int(entry) - nblk * blocksize
|
base = int(entry) - nblk * blocksize
|
||||||
while nblk > 0:
|
while nblk > 0:
|
||||||
@@ -352,14 +351,12 @@ class Memdump(gdb.Command):
|
|||||||
"""Dump the mempool memory"""
|
"""Dump the mempool memory"""
|
||||||
for pool in mempool_multiple_foreach(mpool):
|
for pool in mempool_multiple_foreach(mpool):
|
||||||
if pid == PID_MM_FREE:
|
if pid == PID_MM_FREE:
|
||||||
entry = sq_queue_type.pointer()
|
for entry in sq_for_every(pool["queue"]):
|
||||||
|
|
||||||
for entry in sq_for_every(pool["queue"], entry):
|
|
||||||
gdb.write("%12u%#*x\n" % (pool["blocksize"], self.align, entry))
|
gdb.write("%12u%#*x\n" % (pool["blocksize"], self.align, entry))
|
||||||
self.aordblks += 1
|
self.aordblks += 1
|
||||||
self.uordblks += pool["blocksize"]
|
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))
|
gdb.write("%12u%#*x\n" % (pool["blocksize"], self.align, entry))
|
||||||
self.aordblks += 1
|
self.aordblks += 1
|
||||||
self.uordblks += pool["blocksize"]
|
self.uordblks += pool["blocksize"]
|
||||||
|
|||||||
+2
-4
@@ -68,9 +68,7 @@ def socket_for_each_entry(proto):
|
|||||||
sock_gdbtype = gdb.lookup_type("struct socket_conn_s").pointer()
|
sock_gdbtype = gdb.lookup_type("struct socket_conn_s").pointer()
|
||||||
conn_gdbtype = gdb.lookup_type("struct %s_conn_s" % proto).pointer()
|
conn_gdbtype = gdb.lookup_type("struct %s_conn_s" % proto).pointer()
|
||||||
|
|
||||||
for node in dq_for_every(
|
for node in dq_for_every(gdb.parse_and_eval("g_active_%s_connections" % proto)):
|
||||||
gdb.parse_and_eval("g_active_%s_connections" % proto), None
|
|
||||||
):
|
|
||||||
yield utils.container_of(
|
yield utils.container_of(
|
||||||
utils.container_of(
|
utils.container_of(
|
||||||
node, sock_gdbtype, "node"
|
node, sock_gdbtype, "node"
|
||||||
@@ -86,7 +84,7 @@ def wrbuffer_inqueue_size(queue=None, protocol="tcp"):
|
|||||||
total = 0
|
total = 0
|
||||||
if queue:
|
if queue:
|
||||||
wrb_gdbtype = gdb.lookup_type("struct %s_wrbuffer_s" % protocol).pointer()
|
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")
|
entry = utils.container_of(entry, wrb_gdbtype, "wb_node")
|
||||||
total += entry["wb_iob"]["io_pktlen"]
|
total += entry["wb_iob"]["io_pktlen"]
|
||||||
return total
|
return total
|
||||||
|
|||||||
Reference in New Issue
Block a user