summaryrefslogtreecommitdiff
path: root/tools/gc_activity.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/gc_activity.py')
-rw-r--r--tools/gc_activity.py40
1 files changed, 30 insertions, 10 deletions
diff --git a/tools/gc_activity.py b/tools/gc_activity.py
index cc9a21836..6a1772faa 100644
--- a/tools/gc_activity.py
+++ b/tools/gc_activity.py
@@ -10,18 +10,22 @@ current_heap = {}
allocation_history = []
root = {}
+
def change_root(trace, size):
level = root
for frame in reversed(trace):
file_location = frame[1]
if file_location not in level:
- level[file_location] = {"blocks": 0,
- "file": file_location,
- "function": frame[2],
- "subcalls": {}}
+ level[file_location] = {
+ "blocks": 0,
+ "file": file_location,
+ "function": frame[2],
+ "subcalls": {},
+ }
level[file_location]["blocks"] += size
level = level[file_location]["subcalls"]
+
total_actions = 0
with open(sys.argv[1], "r") as f:
for line in f:
@@ -31,13 +35,13 @@ with open(sys.argv[1], "r") as f:
action = None
if line.startswith("Breakpoint 2"):
break
- next(f) # throw away breakpoint code line
- next(f) # first frame
+ next(f) # throw away breakpoint code line
+ next(f) # first frame
block = 0
size = 0
trace = []
for line in f:
- #print(line.strip())
+ # print(line.strip())
if line[0] == "#":
frame = line.strip().split()
if frame[1].startswith("0x"):
@@ -52,7 +56,12 @@ with open(sys.argv[1], "r") as f:
action = "unknown"
if block not in current_heap:
- current_heap[block] = {"start_block": block, "size": size, "start_trace": trace, "start_time": total_actions}
+ current_heap[block] = {
+ "start_block": block,
+ "size": size,
+ "start_trace": trace,
+ "start_time": total_actions,
+ }
action = "alloc"
change_root(trace, size)
else:
@@ -62,7 +71,12 @@ with open(sys.argv[1], "r") as f:
change_root(alloc["start_trace"], -1 * alloc["size"])
if size > 0:
action = "realloc"
- current_heap[block] = {"start_block": block, "size": size, "start_trace": trace, "start_time": total_actions}
+ current_heap[block] = {
+ "start_block": block,
+ "size": size,
+ "start_trace": trace,
+ "start_time": total_actions,
+ }
change_root(trace, size)
else:
action = "free"
@@ -81,13 +95,19 @@ for alloc in current_heap.values():
alloc["end_time"] = total_actions
allocation_history.append(alloc)
+
def print_frame(frame, indent=0):
for key in sorted(frame):
- if not frame[key]["blocks"] or key.startswith("../py/malloc.c") or key.startswith("../py/gc.c"):
+ if (
+ not frame[key]["blocks"]
+ or key.startswith("../py/malloc.c")
+ or key.startswith("../py/gc.c")
+ ):
continue
print(" " * (indent - 1), key, frame[key]["function"], frame[key]["blocks"], "blocks")
print_frame(frame[key]["subcalls"], indent + 2)
+
print_frame(root)
total_blocks = 0
for key in sorted(root):