Skip to content

Commit

Permalink
pythonGH-96612: Skip incomplete frames in tracemalloc traces. (python…
Browse files Browse the repository at this point in the history
  • Loading branch information
markshannon authored Sep 6, 2022
1 parent f0d9136 commit 95e271b
Show file tree
Hide file tree
Showing 3 changed files with 23 additions and 3 deletions.
14 changes: 14 additions & 0 deletions Lib/test/test_tracemalloc.py
Original file line number Diff line number Diff line change
Expand Up @@ -360,6 +360,20 @@ def test_fork(self):
else:
support.wait_process(pid, exitcode=0)

def test_no_incomplete_frames(self):
tracemalloc.stop()
tracemalloc.start(8)

def f(x):
def g():
return x
return g

obj = f(0).__closure__[0]
traceback = tracemalloc.get_object_traceback(obj)
self.assertIn("test_tracemalloc", traceback[-1].filename)
self.assertNotIn("test_tracemalloc", traceback[-2].filename)


class TestSnapshot(unittest.TestCase):
maxDiff = 4000
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Make sure that incomplete frames do not show up in tracemalloc traces.
11 changes: 8 additions & 3 deletions Modules/_tracemalloc.c
Original file line number Diff line number Diff line change
Expand Up @@ -400,7 +400,13 @@ traceback_get_frames(traceback_t *traceback)
}

_PyInterpreterFrame *pyframe = tstate->cframe->current_frame;
for (; pyframe != NULL;) {
for (;;) {
while (pyframe && _PyFrame_IsIncomplete(pyframe)) {
pyframe = pyframe->previous;
}
if (pyframe == NULL) {
break;
}
if (traceback->nframe < _Py_tracemalloc_config.max_nframe) {
tracemalloc_get_frame(pyframe, &traceback->frames[traceback->nframe]);
assert(traceback->frames[traceback->nframe].filename != NULL);
Expand All @@ -410,8 +416,7 @@ traceback_get_frames(traceback_t *traceback)
traceback->total_nframe++;
}

_PyInterpreterFrame *back = pyframe->previous;
pyframe = back;
pyframe = pyframe->previous;
}
}

Expand Down

0 comments on commit 95e271b

Please sign in to comment.