summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@redhat.com>2018-11-13 14:14:58 (GMT)
committerGitHub <noreply@github.com>2018-11-13 14:14:58 (GMT)
commitf966e5397ed8f5c42c185223fc9b4d750a678d02 (patch)
treef5cb478c7f28e95c498c46678c43864c499cfa24
parent474eedfb3d1b6fecbd749f36bf4a987cf4a00b44 (diff)
downloadcpython-f966e5397ed8f5c42c185223fc9b4d750a678d02.zip
cpython-f966e5397ed8f5c42c185223fc9b4d750a678d02.tar.gz
cpython-f966e5397ed8f5c42c185223fc9b4d750a678d02.tar.bz2
bpo-29564:_PyMem_DumpTraceback() suggests enabling tracemalloc (GH-10510)
If tracemalloc is not tracing Python memory allocations, _PyMem_DumpTraceback() now suggests to enable tracemalloc to get the traceback where the memory block has been allocated.
-rw-r--r--Lib/test/test_capi.py4
-rw-r--r--Modules/_tracemalloc.c6
2 files changed, 10 insertions, 0 deletions
diff --git a/Lib/test/test_capi.py b/Lib/test/test_capi.py
index b3600eb..3c8c3f0 100644
--- a/Lib/test/test_capi.py
+++ b/Lib/test/test_capi.py
@@ -486,6 +486,8 @@ class PyMemDebugTests(unittest.TestCase):
r" The block was made by call #[0-9]+ to debug malloc/realloc.\n"
r" Data at p: cb cb cb .*\n"
r"\n"
+ r"Enable tracemalloc to get the memory block allocation traceback\n"
+ r"\n"
r"Fatal Python error: bad trailing pad byte")
regex = regex.format(ptr=self.PTR_REGEX)
regex = re.compile(regex, flags=re.DOTALL)
@@ -500,6 +502,8 @@ class PyMemDebugTests(unittest.TestCase):
r" The block was made by call #[0-9]+ to debug malloc/realloc.\n"
r" Data at p: cb cb cb .*\n"
r"\n"
+ r"Enable tracemalloc to get the memory block allocation traceback\n"
+ r"\n"
r"Fatal Python error: bad ID: Allocated using API 'm', verified using API 'r'\n")
regex = regex.format(ptr=self.PTR_REGEX)
self.assertRegex(out, regex)
diff --git a/Modules/_tracemalloc.c b/Modules/_tracemalloc.c
index 1005f2e..c5d5671 100644
--- a/Modules/_tracemalloc.c
+++ b/Modules/_tracemalloc.c
@@ -1471,6 +1471,12 @@ _PyMem_DumpTraceback(int fd, const void *ptr)
traceback_t *traceback;
int i;
+ if (!_Py_tracemalloc_config.tracing) {
+ PUTS(fd, "Enable tracemalloc to get the memory block "
+ "allocation traceback\n\n");
+ return;
+ }
+
traceback = tracemalloc_get_traceback(DEFAULT_DOMAIN, (uintptr_t)ptr);
if (traceback == NULL)
return;