Posted on :: 146 Words :: Tags: , ,

While working on powerdns-api-proxy, I encountered an interesting memory leak. The problem arose from repeatedly raising the same exception object when a DNS zone was not allowed.

Here's a simplified example that demonstrates the problem:

# simplified example of raising the same exception object in a loop
my_exception = ValueError('Test')
while True:
    try:
        raise my_exception
    except:
        pass

Each time an exception is raised in Python, the interpreter creates a new traceback object. Even though we're reusing the same exception object (my_exception), each raise statement generates a new traceback that includes:

  • Stack frame information
  • Local variables
  • Line numbers
  • Other debugging details

While the except block catches the exception, these traceback objects accumulate in memory because Python's garbage collector doesn't immediately clean them up. Over time, this leads to increasing memory usage until the system runs out of available memory.