malloc-tracer

This is a debugging tool for tracing malloc that occurs inside a function or class.


Keywords
debug, debugging-tool, tracemalloc, python, python3
License
MIT
Install
pip install malloc-tracer==1.7.0

Documentation

License Build Status PyPI version Pyversions

malloc_tracer

About

This is a debugging tool for tracing malloc that occurs inside a function or class.

import numpy as np
import malloc_tracer


def func(x, y, z):
    dataset1 = np.empty((100, ), dtype=np.float64)
    print('x', x)
    dataset1 = np.empty((1000, ), dtype=np.float64)

    l = [i for i in range(100000)]

    if x == 0:
        dataset4a = np.empty((100000, ), dtype=np.float64)
        return 0
    elif x == 1:
        dataset4b = np.empty((100000, ), dtype=np.float64)
        return 1

    dataset3 = np.empty((3000, ), dtype=np.float64)
    return 2


tracer = malloc_tracer.Tracer(func)

This is equivalent to the following code.

import numpy as np
from tracemalloc import start, take_snapshot, stop


SNAPSHOT = None


def func(x, y, z):
    try:
        start()
        dataset1 = np.empty((100,), dtype=np.float64)
        print('x', x)
        dataset1 = np.empty((1000,), dtype=np.float64)

        l = [i for i in range(100000)]

        if (x == 0):
            dataset4a = np.empty((100000,), dtype=np.float64)
            return 0
        elif (x == 1):
            dataset4b = np.empty((100000,), dtype=np.float64)
            return 1

        dataset3 = np.empty((3000,), dtype=np.float64)
        return 2
    finally:
        global SNAPSHOT
        SNAPSHOT = take_snapshot()
        stop()

Feature

Compatibility

malloc_tracer works with Python 3.4 or higher.

Dependencies

Installation

pip install malloc-tracer

Usage

Trace a function.

import numpy as np
import malloc_tracer


def func(x, y, z):
    dataset1 = np.empty((100, ), dtype=np.float64)
    print('x', x)
    dataset1 = np.empty((1000, ), dtype=np.float64)

    l = [i for i in range(100000)]

    if x == 0:
        dataset4a = np.empty((100000, ), dtype=np.float64)
        return 0
    elif x == 1:
        dataset4b = np.empty((100000, ), dtype=np.float64)
        return 1

    dataset3 = np.empty((3000, ), dtype=np.float64)
    return 2
tracer = malloc_tracer.Tracer(func)
tracer.trace(
    target_args=dict(x=1, y=2, z=3)
)

usage1

Trace a method.

import numpy as np
import malloc_tracer


class Klass(object):

    CONSTANT = 'CONSTANT'

    def __init__(self, value):
        self._value = value

    def method(self, x):
        dataset1 = np.empty((100, ), dtype=np.float64)
        print('x', x)
        dataset1 = np.empty((1000, ), dtype=np.float64)

        l = [i for i in range(100000)]

        if x == 0:
            dataset4a = np.empty((100000, ), dtype=np.float64)
            return 0
        elif x == 1:
            dataset4b = np.empty((100000, ), dtype=np.float64)
            return 1

        dataset3 = np.empty((3000, ), dtype=np.float64)
        return 2

    @staticmethod
    def smethod():
        dataset = np.empty((100, ), dtype=np.float64)
        l = [i for i in range(100000)]
        print('Hello')
        return dataset

    @classmethod
    def cmethod(cls, var):
        return cls.CONSTANT + var
instance = Klass(1)
tracer = malloc_tracer.Tracer(instance.method)
tracer.trace(
    target_args=dict(x=1)
)

usage2a

Trace a static method.

tracer = malloc_tracer.Tracer(Klass.smethod)
tracer.trace(
    target_args=dict()
)

usage2b

Trace a class method.

tracer = malloc_tracer.Tracer(Klass.cmethod)
tracer.trace(
    target_args=dict(var='Hello world.')
)

usage2c

Displays related traces for each file.

import numpy as np
import malloc_tracer


global_var1 = None
global_var2 = None


def func2():
    global global_var1
    global global_var2
    global_var1 = np.empty((1000, ), dtype=np.float64)
    global_var2 = np.empty((10000, ), dtype=np.float64)


def func(x, y, z):
    dataset1 = np.empty((100, ), dtype=np.float64)
    print('x', x)
    dataset1 = np.empty((1000, ), dtype=np.float64)

    l = [i for i in range(100000)]

    func2()

    if x == 0:
        dataset4a = np.empty((100000, ), dtype=np.float64)
        return 0
    elif x == 1:
        dataset4b = np.empty((100000, ), dtype=np.float64)
        return 1

    dataset3 = np.empty((3000, ), dtype=np.float64)
    return 2
tracer = malloc_tracer.Tracer(func)
tracer.trace(
    target_args=dict(x=1, y=2, z=3),
    related_traces_output_mode=malloc_tracer.RelatedTracesOutputMode.FOR_EACH_FILE
)

usage3a

Displays related traces in descending order.

tracer = malloc_tracer.Tracer(func)
tracer.trace(
    target_args=dict(x=1, y=2, z=3),
    related_traces_output_mode=malloc_tracer.RelatedTracesOutputMode.IN_DESCENDING_ORDER
)

usage3b

Convenience function.

malloc_tracer.trace(
    func,
    target_args=dict(x=1, y=2, z=3),
    related_traces_output_mode=malloc_tracer.RelatedTracesOutputMode.IN_DESCENDING_ORDER
)

License

This software is released under the MIT License, see LICENSE.