mirror of
https://github.com/python/cpython.git
synced 2025-09-26 18:29:57 +00:00
[3.12] gh-103956: Fix trace
output in case of missing source line (GH-103958) (GH-118832)
Print only filename with lineno if linecache.getline() returns an empty string.
(cherry picked from commit 7c87ce777b
)
Co-authored-by: Radislav Chugunov <52372310+chgnrdv@users.noreply.github.com>
This commit is contained in:
parent
e9539568be
commit
0d626760a4
3 changed files with 38 additions and 4 deletions
|
@ -6,6 +6,7 @@ from test.support.os_helper import (TESTFN, rmtree, unlink)
|
||||||
from test.support.script_helper import assert_python_ok, assert_python_failure
|
from test.support.script_helper import assert_python_ok, assert_python_failure
|
||||||
import textwrap
|
import textwrap
|
||||||
import unittest
|
import unittest
|
||||||
|
from types import FunctionType
|
||||||
|
|
||||||
import trace
|
import trace
|
||||||
from trace import Trace
|
from trace import Trace
|
||||||
|
@ -559,5 +560,29 @@ class TestCommandLine(unittest.TestCase):
|
||||||
assert_python_failure('-m', 'trace', '-l', '--module', 'not_a_module_zzz')
|
assert_python_failure('-m', 'trace', '-l', '--module', 'not_a_module_zzz')
|
||||||
|
|
||||||
|
|
||||||
|
class TestTrace(unittest.TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
self.addCleanup(sys.settrace, sys.gettrace())
|
||||||
|
self.tracer = Trace(count=0, trace=1)
|
||||||
|
self.filemod = my_file_and_modname()
|
||||||
|
|
||||||
|
def test_no_source_file(self):
|
||||||
|
filename = "<unknown>"
|
||||||
|
co = traced_func_linear.__code__
|
||||||
|
co = co.replace(co_filename=filename)
|
||||||
|
f = FunctionType(co, globals())
|
||||||
|
|
||||||
|
with captured_stdout() as out:
|
||||||
|
self.tracer.runfunc(f, 2, 3)
|
||||||
|
|
||||||
|
out = out.getvalue().splitlines()
|
||||||
|
firstlineno = get_firstlineno(f)
|
||||||
|
self.assertIn(f" --- modulename: {self.filemod[1]}, funcname: {f.__code__.co_name}", out[0])
|
||||||
|
self.assertIn(f"{filename}({firstlineno + 1})", out[1])
|
||||||
|
self.assertIn(f"{filename}({firstlineno + 2})", out[2])
|
||||||
|
self.assertIn(f"{filename}({firstlineno + 3})", out[3])
|
||||||
|
self.assertIn(f"{filename}({firstlineno + 4})", out[4])
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
if __name__ == '__main__':
|
||||||
unittest.main()
|
unittest.main()
|
||||||
|
|
16
Lib/trace.py
16
Lib/trace.py
|
@ -559,8 +559,12 @@ class Trace:
|
||||||
if self.start_time:
|
if self.start_time:
|
||||||
print('%.2f' % (_time() - self.start_time), end=' ')
|
print('%.2f' % (_time() - self.start_time), end=' ')
|
||||||
bname = os.path.basename(filename)
|
bname = os.path.basename(filename)
|
||||||
print("%s(%d): %s" % (bname, lineno,
|
line = linecache.getline(filename, lineno)
|
||||||
linecache.getline(filename, lineno)), end='')
|
print("%s(%d)" % (bname, lineno), end='')
|
||||||
|
if line:
|
||||||
|
print(": ", line, end='')
|
||||||
|
else:
|
||||||
|
print()
|
||||||
return self.localtrace
|
return self.localtrace
|
||||||
|
|
||||||
def localtrace_trace(self, frame, why, arg):
|
def localtrace_trace(self, frame, why, arg):
|
||||||
|
@ -572,8 +576,12 @@ class Trace:
|
||||||
if self.start_time:
|
if self.start_time:
|
||||||
print('%.2f' % (_time() - self.start_time), end=' ')
|
print('%.2f' % (_time() - self.start_time), end=' ')
|
||||||
bname = os.path.basename(filename)
|
bname = os.path.basename(filename)
|
||||||
print("%s(%d): %s" % (bname, lineno,
|
line = linecache.getline(filename, lineno)
|
||||||
linecache.getline(filename, lineno)), end='')
|
print("%s(%d)" % (bname, lineno), end='')
|
||||||
|
if line:
|
||||||
|
print(": ", line, end='')
|
||||||
|
else:
|
||||||
|
print()
|
||||||
return self.localtrace
|
return self.localtrace
|
||||||
|
|
||||||
def localtrace_count(self, frame, why, arg):
|
def localtrace_count(self, frame, why, arg):
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
Fix lack of newline characters in :mod:`trace` module output when line tracing is enabled but source code line for current frame is not available.
|
Loading…
Add table
Add a link
Reference in a new issue