Created
December 1, 2023 14:48
-
-
Save battleguard/10546597fc0140a75e5aa4b6a02473ea to your computer and use it in GitHub Desktop.
Circular reference detection methods
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
def obj_from_id(obj_id: int): | |
# <https://stackoverflow.com/a/15702647> | |
return ctypes.cast(obj_id, ctypes.py_object).value | |
def print_referrers_tree(obj_id: int, level=0, prev_ids: set[int] | None = None) -> None: | |
if prev_ids is None: | |
prev_ids = set[int]() | |
if level > 20: | |
return | |
if obj_id in prev_ids: | |
print(f"{' ' * level}{level+1}:{hex(obj_id)} | !CIRCULAR REFERENCE FOUND! | {(obj_from_id(obj_id)).__class__.__name__} | {obj_from_id(obj_id)}") | |
return | |
else: | |
print(f"{' ' * level}{level+1}:{hex(obj_id)} | {(obj_from_id(obj_id)).__class__.__name__} | {obj_from_id(obj_id)}") | |
referrer_ids = [id(r) for r in gc.get_referrers(obj_from_id(obj_id))] | |
gc.collect() | |
for r_id in referrer_ids: | |
new_set = set(prev_ids) | |
new_set.add(obj_id) | |
print_referrers_tree(r_id, level + 1, new_set) |
Author
battleguard
commented
Dec 1, 2023
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment