diff --git a/warden3/warden_client/warden_client.py b/warden3/warden_client/warden_client.py index 9e78526611319acf8ce086a714d27215d847a4f3..9f713938437a0da18c38d5ddc193c9e84c884c70 100644 --- a/warden3/warden_client/warden_client.py +++ b/warden3/warden_client/warden_client.py @@ -120,6 +120,14 @@ class Error(Exception): kwargs["send_events_limit"] = int(kwargs["send_events_limit"]) except Exception: del kwargs["send_events_limit"] + if "exc" in kwargs: + # Traceback objects cause reference loops, so memory may be not + # correctly free'd. We only need traceback to log it in str_debug(), + # so let's get the string representation now and forget the + # traceback object, thus preventing the loop. + exctype, excvalue, tb = kwargs["exc"] + tb = format_tb(tb) + kwargs["exc"] = exctype, excvalue, tb self.errors.append(kwargs) @@ -211,10 +219,10 @@ class Error(Exception): out.append(self.str_preamble(e)) if not "exc" in e or not e["exc"]: return "" - exc_tb = e["exc"][2] + exc_tb = e["exc"][2] # exc_tb is string repr. of traceback object if exc_tb: out.append("Traceback:\n") - out.extend(format_tb(exc_tb)) + out.extend(exc_tb) return "".join(out)