Skip to content

Commit

Permalink
chore: add a script that parses allocator tracking logs
Browse files Browse the repository at this point in the history
  • Loading branch information
romange committed Sep 10, 2024
1 parent 2577492 commit 14aff84
Show file tree
Hide file tree
Showing 2 changed files with 47 additions and 1 deletion.
3 changes: 2 additions & 1 deletion src/core/allocation_tracker.cc
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,8 @@ void AllocationTracker::ProcessDelete(void* ptr) {
if (tracking_.size() == 1 && tracking_.front().sample_odds == 1) {
size_t usable = mi_usable_size(ptr);
if (usable <= tracking_.front().upper_bound && usable >= tracking_.front().lower_bound) {
LOG(INFO) << "Deallocating " << usable << " bytes (" << ptr << ")";
LOG(INFO) << "Deallocating " << usable << " bytes (" << ptr << ")\n"
<< util::fb2::GetStacktrace();
}
}
inside_tracker_ = false;
Expand Down
45 changes: 45 additions & 0 deletions tools/parse_allocator_tracking_logs.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
#!/usr/bin/env python3

"""
Usage:
1. First run Dragonfly with tracking allocator enabled. Must be a single allocator range with 100% samping rate to catch both allocations and deallocations.
2. Finish tracking.
3. cat /tmp/dragonfly.INFO | ./parse_allocator_tracking_logs.py
"""
import re
import sys


def parse_log(log_lines):
memory_map = {}

allocation_pattern = re.compile(r"Allocating (\d+) bytes \((0x[0-9a-f]+)\)")
deallocation_pattern = re.compile(r"Deallocating (\d+) bytes \((0x[0-9a-f]+)\)")

for line in log_lines:
allocation_match = allocation_pattern.search(line)
deallocation_match = deallocation_pattern.search(line)

if allocation_match:
size = int(allocation_match.group(1))
address = allocation_match.group(2)
assert address not in memory_map
memory_map[address] = (size, line)
elif deallocation_match:
size = int(deallocation_match.group(1))
address = deallocation_match.group(2)
if address in memory_map:
assert size == memory_map[address][0]
del memory_map[address]
else:
print(f"Deallocating non existing address: {address} {size}")

return memory_map


if __name__ == "__main__":
log_lines = sys.stdin.readlines()
memory_map = parse_log(log_lines)

for address, item in memory_map.items():
print(f"Address: {address}, Size: {item[0]} bytes, original line: `{item[1]}`")

0 comments on commit 14aff84

Please sign in to comment.