pynuttx: optimize memory leak check by skipping previously checked pointers

Reduce leak analysis time from 12s to 7.8s, achieving a 35% performance improvement that tested on an internal project.

1. Use memoryview to avoid creating int objects, reducing overhead
2. Store checked pointers in a dictionary for efficient lookups, improving performance.
3. While dictionary operations have some cost, the overall speedup is significant.

Signed-off-by: xuxingliang <xuxingliang@xiaomi.com>
This commit is contained in:
xuxingliang
2024-12-02 17:11:55 +08:00
committed by Alan C. Assis
parent b90638493a
commit 04bd00f80a

View File

@@ -131,19 +131,34 @@ class MMLeak(gdb.Command):
longsize = utils.get_long_type().sizeof
checked_ptr = {}
def pointers(node: memdump.MMNodeDump) -> Generator[int, None, None]:
# Return all possible pointers stored in this node
size = node.nodesize - node.overhead
memory = node.read_memory()
prev_mem = None
while size > 0:
size -= longsize
ptr = int.from_bytes(memory[size : size + longsize], "little")
mem = memory[size : size + longsize]
if mem == prev_mem:
continue
prev_mem = mem
ptr = int.from_bytes(mem, "little")
if ptr in checked_ptr:
continue
checked_ptr[ptr] = True
if any(region["start"] <= ptr < region["end"] for region in regions):
yield ptr
print("Leak analyzing...", flush=True, end="")
t = time.time()
for good in good_nodes:
if not sorted_addr: # All nodes are checked
break
for ptr in pointers(good):
if not (idx := bisect.bisect_right(sorted_addr, ptr)):
continue