xpra icon
Bug tracker and wiki

Ticket #1662: leak-show-lists.patch

File leak-show-lists.patch, 2.2 KB (added by Antoine Martin, 2 years ago)

show the lists that leak and their backref (applies to r17356)

  • xpra/util.py

     
    545545    finally:
    546546        del frame
    547547
     548seq = 0
     549listids = []
    548550def detect_leaks():
    549551    try:
    550552        from pympler import tracker
     
    552554        get_util_logger().warn("Warning: cannot enable memory leak detection:")
    553555        get_util_logger().warn(" %s", e)
    554556        return None
     557    import objgraph
    555558    import gc
    556559    gc.enable()
    557560    gc.set_debug(gc.DEBUG_LEAK)
    558     tr = tracker.SummaryTracker()
    559     def print_leaks():
    560         tr.print_diff()
    561         return True
     561    if True:
     562        tr = tracker.SummaryTracker()
     563        def print_leaks():
     564            tr.print_diff()
     565            return True
     566    else:
     567        def print_leaks():
     568            global listids, seq
     569            objs = gc.get_objects()
     570            print("%i objects" % len(objs))
     571            exclude = tuple(id(x) for x in (globals().values()+locals().values()))
     572            lists = [x for x in objs if type(x)==list and x not in exclude]
     573            print("%i lists" % len(lists))
     574            del objs
     575            nl = [id(x) for x in lists]
     576            if listids:
     577                newlists = [x for x in lists if id(x) not in listids]
     578                print("%i new lists:" % len(newlists))
     579                if len(newlists)<512:
     580                    if len(newlists)<20:
     581                        for i,newlist in enumerate(newlists):
     582                            objgraph.show_refs([newlist], extra_ignore=[exclude], filename='list-%i-%i-refs.png' % (seq, i))         
     583                            objgraph.show_backrefs([newlist], extra_ignore=[exclude], filename='list-%i-%i-backrefs.png' % (seq, i))
     584                        seq += 1
     585                    for i,newlist in enumerate(newlists):
     586                        l = len(newlist)
     587                        if l<100:
     588                            print("[%3i]=%s (%i items)" % (i, repr_ellipsized(csv(newlist), limit=200), l))
     589                        else:
     590                            print("[%3i]=%i %s items!" % (i, l, type(newlist)))
     591            listids = nl
     592            return True
    562593    return print_leaks
    563594
    564595