logging.captureWarnings(True) doesn't show object allocation (-X tracemalloc)
Nobody has claimed this yet.
- Dominant language
- Python
- Stars
- 77.2k
- Forks
- 36k
- PR merge metrics
- PR metrics pending
Description
Bug report
When using logging.captureWarnings(True), the information about object allocation that you should get with -X tracemalloc gets lost.
It appears to be a discrepancy between Python and C implementation of the warnings module? source isn't passed to the created WarningMessage object in the Lib/warnings.py:
https://github.com/python/cpython/blob/a17cd47b614f8bc660788647a009a25e121221d7/Lib/warnings.py#L12
https://github.com/python/cpython/blob/a17cd47b614f8bc660788647a009a25e121221d7/Lib/warnings.py#L17
https://github.com/python/cpython/blob/a17cd47b614f8bc660788647a009a25e121221d7/Lib/warnings.py#L394
while it is in Python/_warnings.c:
https://github.com/python/cpython/blob/a17cd47b614f8bc660788647a009a25e121221d7/Python/_warnings.c#L593-L605
Reproduction steps:
- Create a file
repro.pywith contents:
import logging
import tempfile
import warnings
warnings.simplefilter("default", category=ResourceWarning)
logging.basicConfig()
print("--- UNCAPTURED WARNING ---")
file = tempfile.SpooledTemporaryFile(1)
file.write(b"foo")
file = None
print("\n--- CAPTURED WARNING ---")
logging.captureWarnings(True)
file = tempfile.SpooledTemporaryFile(1)
file.write(b"foo")
file = None
- Run
python -X tracemalloc=5 - See that output only contains object allocation traceback for uncaptured warning:
--- UNCAPTURED WARNING ---
/tmp/test_tracemallo/repro.py:12: ResourceWarning: unclosed file <_io.BufferedRandom name=3>
file = None
Object allocated at (most recent call last):
File "/tmp/test_tracemallo/repro.py", lineno 11
file.write(b"foo")
File "/usr/lib/python3.10/tempfile.py", lineno 911
self._check(file)
File "/usr/lib/python3.10/tempfile.py", lineno 807
self.rollover()
File "/usr/lib/python3.10/tempfile.py", lineno 812
newfile = self._file = TemporaryFile(**self._TemporaryFileArgs)
File "/usr/lib/python3.10/tempfile.py", lineno 760
return _io.open(fd, mode, buffering=buffering,
--- CAPTURED WARNING ---
WARNING:py.warnings:/tmp/test_tracemallo/repro.py:18: ResourceWarning: unclosed file <_io.BufferedRandom name=3>
file = None
Your environment
- CPython versions tested on: 3.7.13, 3.8.13, 3.9.13 (installed from deadsnakes ppa), 3.10.4 (system Python)
- Operating system and architecture: Ubuntu 22.04
Linked PRs
- gh-111451
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Compare WarningMessage construction in Lib/warnings.py with the corresponding handling in Python/_warnings.c, then run the provided repro.py command with -X tracemalloc=5. Done means warnings routed through logging.captureWarnings(True) retain the object-allocation traceback shown for uncaptured warnings.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- c, python
- Domain
- backend
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Stale
- Clarity
- Clearly specified
- Newbie friendliness
- 25/100