summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGuido van Rossum <guido@dropbox.com>2013-10-21 01:21:02 (GMT)
committerGuido van Rossum <guido@dropbox.com>2013-10-21 01:21:02 (GMT)
commit7be5d7d0e0f3afda46dad9a76f4981e9161d20ce (patch)
treea0a5518cd480ce1ff23dc626260c3d4afe2e1ef9
parent5c16c2eb457f9bba8bf04e11cf77a3de5035a178 (diff)
downloadcpython-7be5d7d0e0f3afda46dad9a76f4981e9161d20ce.zip
cpython-7be5d7d0e0f3afda46dad9a76f4981e9161d20ce.tar.gz
cpython-7be5d7d0e0f3afda46dad9a76f4981e9161d20ce.tar.bz2
Issue 19306: Add extra hints to faulthandler stack dumps that they are upside down.
-rw-r--r--Lib/test/test_faulthandler.py18
-rw-r--r--Misc/NEWS15
-rw-r--r--Python/traceback.c16
3 files changed, 30 insertions, 19 deletions
diff --git a/Lib/test/test_faulthandler.py b/Lib/test/test_faulthandler.py
index 2d374b9..ebd99ed 100644
--- a/Lib/test/test_faulthandler.py
+++ b/Lib/test/test_faulthandler.py
@@ -72,9 +72,9 @@ class FaultHandlerTests(unittest.TestCase):
Raise an error if the output doesn't match the expected format.
"""
if all_threads:
- header = 'Current thread XXX'
+ header = 'Current thread XXX (most recent call first)'
else:
- header = 'Traceback (most recent call first)'
+ header = 'Stack (most recent call first)'
regex = """
^Fatal Python error: {name}
@@ -306,7 +306,7 @@ funcA()
else:
lineno = 8
expected = [
- 'Traceback (most recent call first):',
+ 'Stack (most recent call first):',
' File "<string>", line %s in funcB' % lineno,
' File "<string>", line 11 in funcA',
' File "<string>", line 13 in <module>'
@@ -338,7 +338,7 @@ def {func_name}():
func_name=func_name,
)
expected = [
- 'Traceback (most recent call first):',
+ 'Stack (most recent call first):',
' File "<string>", line 4 in %s' % truncated,
' File "<string>", line 6 in <module>'
]
@@ -392,13 +392,13 @@ waiter.join()
else:
lineno = 10
regex = """
-^Thread 0x[0-9a-f]+:
+^Thread 0x[0-9a-f]+ \(most recent call first\):
(?: File ".*threading.py", line [0-9]+ in [_a-z]+
){{1,3}} File "<string>", line 23 in run
File ".*threading.py", line [0-9]+ in _bootstrap_inner
File ".*threading.py", line [0-9]+ in _bootstrap
-Current thread XXX:
+Current thread XXX \(most recent call first\):
File "<string>", line {lineno} in dump
File "<string>", line 28 in <module>$
""".strip()
@@ -461,7 +461,7 @@ if file is not None:
count = loops
if repeat:
count *= 2
- header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+:\n' % timeout_str
+ header = r'Timeout \(%s\)!\nThread 0x[0-9a-f]+ \(most recent call first\):\n' % timeout_str
regex = expected_traceback(9, 20, header, min_count=count)
self.assertRegex(trace, regex)
else:
@@ -563,9 +563,9 @@ sys.exit(exitcode)
trace = '\n'.join(trace)
if not unregister:
if all_threads:
- regex = 'Current thread XXX:\n'
+ regex = 'Current thread XXX \(most recent call first\):\n'
else:
- regex = 'Traceback \(most recent call first\):\n'
+ regex = 'Stack \(most recent call first\):\n'
regex = expected_traceback(7, 28, regex)
self.assertRegex(trace, regex)
else:
diff --git a/Misc/NEWS b/Misc/NEWS
index 8a31887..379dfd7 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -2,10 +2,21 @@
Python News
+++++++++++
+What's New in Python 3.4.0 Beta 1?
+==================================
+
+Projected release date: 2013-11-24
+
+Core and Builtins
+-----------------
+
+- Issue 19306: Add extra hints to the faulthandler module's stack
+ dumps that these are "upside down".
+
What's New in Python 3.4.0 Alpha 4?
-================================
+===================================
-Projected release date: 2013-10-20
+Release date: 2013-10-20
Core and Builtins
-----------------
diff --git a/Python/traceback.c b/Python/traceback.c
index 4f2e732..01e9473 100644
--- a/Python/traceback.c
+++ b/Python/traceback.c
@@ -471,13 +471,13 @@ dump_decimal(int fd, int value)
write(fd, buffer, len);
}
-/* Format an integer in range [0; 0xffffffff] to hexdecimal of 'width' digits,
+/* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits,
and write it into the file fd.
This function is signal safe. */
static void
-dump_hexadecimal(int width, unsigned long value, int fd)
+dump_hexadecimal(int fd, unsigned long value, int width)
{
int len;
char buffer[sizeof(unsigned long) * 2 + 1];
@@ -544,15 +544,15 @@ dump_ascii(int fd, PyObject *text)
}
else if (ch < 0xff) {
PUTS(fd, "\\x");
- dump_hexadecimal(2, ch, fd);
+ dump_hexadecimal(fd, ch, 2);
}
else if (ch < 0xffff) {
PUTS(fd, "\\u");
- dump_hexadecimal(4, ch, fd);
+ dump_hexadecimal(fd, ch, 4);
}
else {
PUTS(fd, "\\U");
- dump_hexadecimal(8, ch, fd);
+ dump_hexadecimal(fd, ch, 8);
}
}
if (truncated)
@@ -603,7 +603,7 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)
unsigned int depth;
if (write_header)
- PUTS(fd, "Traceback (most recent call first):\n");
+ PUTS(fd, "Stack (most recent call first):\n");
frame = _PyThreadState_GetFrame(tstate);
if (frame == NULL)
@@ -641,8 +641,8 @@ write_thread_id(int fd, PyThreadState *tstate, int is_current)
PUTS(fd, "Current thread 0x");
else
PUTS(fd, "Thread 0x");
- dump_hexadecimal(sizeof(long)*2, (unsigned long)tstate->thread_id, fd);
- PUTS(fd, ":\n");
+ dump_hexadecimal(fd, (unsigned long)tstate->thread_id, sizeof(long)*2);
+ PUTS(fd, " (most recent call first):\n");
}
const char*