[Python-checkins] bpo-29564: warnings suggests to enable tracemalloc (GH-10486) (GH-10509)
Victor Stinner
webhook-mailer at python.org
Tue Dec 4 15:26:01 EST 2018
https://github.com/python/cpython/commit/0091f349cde179ea991f4ee4d095119cd1fc3802
commit: 0091f349cde179ea991f4ee4d095119cd1fc3802
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: Victor Stinner <vstinner at redhat.com>
date: 2018-12-04T21:25:57+01:00
summary:
bpo-29564: warnings suggests to enable tracemalloc (GH-10486) (GH-10509)
The warnings module now suggests to enable tracemalloc if the source
is specified, tracemalloc module is available, but tracemalloc is not
tracing memory allocations.
(cherry picked from commit 2c07c493d2eb45101312e3eb3a77f94d0c9cad1f)
Co-authored-by: Victor Stinner <vstinner at redhat.com>
files:
A Misc/NEWS.d/next/Library/2018-11-12-17-40-04.bpo-29564.SFNBT5.rst
M Lib/test/test_warnings/__init__.py
M Lib/warnings.py
diff --git a/Lib/test/test_warnings/__init__.py b/Lib/test/test_warnings/__init__.py
index 7f3f3fffb5d2..a40a9a297c82 100644
--- a/Lib/test/test_warnings/__init__.py
+++ b/Lib/test/test_warnings/__init__.py
@@ -960,12 +960,27 @@ def func():
func()
"""))
- res = assert_python_ok('-Wd', '-X', 'tracemalloc=2', support.TESTFN)
+ def run(*args):
+ res = assert_python_ok(*args)
+ stderr = res.err.decode('ascii', 'replace')
+ stderr = '\n'.join(stderr.splitlines())
- stderr = res.err.decode('ascii', 'replace')
- # normalize newlines
- stderr = '\n'.join(stderr.splitlines())
- stderr = re.sub('<.*>', '<...>', stderr)
+ # normalize newlines
+ stderr = re.sub('<.*>', '<...>', stderr)
+ return stderr
+
+ # tracemalloc disabled
+ stderr = run('-Wd', support.TESTFN)
+ expected = textwrap.dedent('''
+ {fname}:5: ResourceWarning: unclosed file <...>
+ f = None
+ ResourceWarning: Enable tracemalloc to get the object allocation traceback
+ ''')
+ expected = expected.format(fname=support.TESTFN).strip()
+ self.assertEqual(stderr, expected)
+
+ # tracemalloc enabled
+ stderr = run('-Wd', '-X', 'tracemalloc=2', support.TESTFN)
expected = textwrap.dedent('''
{fname}:5: ResourceWarning: unclosed file <...>
f = None
diff --git a/Lib/warnings.py b/Lib/warnings.py
index 81f98647786d..ae4295e120f6 100644
--- a/Lib/warnings.py
+++ b/Lib/warnings.py
@@ -33,9 +33,8 @@ def _showwarnmsg_impl(msg):
pass
def _formatwarnmsg_impl(msg):
- s = ("%s:%s: %s: %s\n"
- % (msg.filename, msg.lineno, msg.category.__name__,
- msg.message))
+ category = msg.category.__name__
+ s = f"{msg.filename}:{msg.lineno}: {category}: {msg.message}\n"
if msg.line is None:
try:
@@ -55,11 +54,20 @@ def _formatwarnmsg_impl(msg):
if msg.source is not None:
try:
import tracemalloc
- tb = tracemalloc.get_object_traceback(msg.source)
+ # Logging a warning should not raise a new exception:
+ # catch Exception, not only ImportError and RecursionError.
except Exception:
- # When a warning is logged during Python shutdown, tracemalloc
- # and the import machinery don't work anymore
+ # don't suggest to enable tracemalloc if it's not available
+ tracing = True
tb = None
+ else:
+ tracing = tracemalloc.is_tracing()
+ try:
+ tb = tracemalloc.get_object_traceback(msg.source)
+ except Exception:
+ # When a warning is logged during Python shutdown, tracemalloc
+ # and the import machinery don't work anymore
+ tb = None
if tb is not None:
s += 'Object allocated at (most recent call last):\n'
@@ -77,6 +85,9 @@ def _formatwarnmsg_impl(msg):
if line:
line = line.strip()
s += ' %s\n' % line
+ elif not tracing:
+ s += (f'{category}: Enable tracemalloc to get the object '
+ f'allocation traceback\n')
return s
# Keep a reference to check if the function was replaced
diff --git a/Misc/NEWS.d/next/Library/2018-11-12-17-40-04.bpo-29564.SFNBT5.rst b/Misc/NEWS.d/next/Library/2018-11-12-17-40-04.bpo-29564.SFNBT5.rst
new file mode 100644
index 000000000000..7ef3adeb73b9
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2018-11-12-17-40-04.bpo-29564.SFNBT5.rst
@@ -0,0 +1,3 @@
+The warnings module now suggests to enable tracemalloc if the source is
+specified, the tracemalloc module is available, but tracemalloc is not
+tracing memory allocations.
More information about the Python-checkins
mailing list