blob: b00864b06e43cd1969730e3d1652c4e8654bdd2c [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Traceback implementation */
3
Guido van Rossum65bf9f21997-04-29 18:33:38 +00004#include "Python.h"
Eric Snow2ebc5ce2017-09-07 23:51:28 -06005#include "internal/pystate.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00006
Jeremy Hylton3e0055f2005-10-20 19:59:25 +00007#include "code.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00008#include "frameobject.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00009#include "structmember.h"
Guido van Rossum7169dbb1992-02-26 15:17:59 +000010#include "osdefs.h"
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +000011#ifdef HAVE_FCNTL_H
12#include <fcntl.h>
13#endif
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
Nicholas Bastina7604bf2004-03-21 18:37:23 +000015#define OFF(x) offsetof(PyTracebackObject, x)
Guido van Rossum3f5da241990-12-20 15:06:42 +000016
Victor Stinner97f86b82015-04-01 18:38:01 +020017#define PUTS(fd, str) _Py_write_noraise(fd, str, (int)strlen(str))
Victor Stinner54f939b2012-07-30 13:08:58 +020018#define MAX_STRING_LENGTH 500
Victor Stinner024e37a2011-03-31 01:31:06 +020019#define MAX_FRAME_DEPTH 100
20#define MAX_NTHREADS 100
21
Victor Stinnerfe7c5b52011-04-05 01:48:03 +020022/* Function from Parser/tokenizer.c */
23extern char * PyTokenizer_FindEncodingFilename(int, PyObject *);
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +000024
Victor Stinnerbd303c12013-11-07 23:07:29 +010025_Py_IDENTIFIER(TextIOWrapper);
26_Py_IDENTIFIER(close);
27_Py_IDENTIFIER(open);
28_Py_IDENTIFIER(path);
29
Nathaniel J. Smithe46a8af2018-01-07 05:30:18 -080030/*[clinic input]
31class TracebackType "PyTracebackObject *" "&PyTraceback_Type"
32[clinic start generated code]*/
33/*[clinic end generated code: output=da39a3ee5e6b4b0d input=928fa06c10151120]*/
34
35#include "clinic/traceback.c.h"
36
37static PyObject *
38tb_create_raw(PyTracebackObject *next, PyFrameObject *frame, int lasti,
39 int lineno)
40{
41 PyTracebackObject *tb;
42 if ((next != NULL && !PyTraceBack_Check(next)) ||
43 frame == NULL || !PyFrame_Check(frame)) {
44 PyErr_BadInternalCall();
45 return NULL;
46 }
47 tb = PyObject_GC_New(PyTracebackObject, &PyTraceBack_Type);
48 if (tb != NULL) {
49 Py_XINCREF(next);
50 tb->tb_next = next;
51 Py_XINCREF(frame);
52 tb->tb_frame = frame;
53 tb->tb_lasti = lasti;
54 tb->tb_lineno = lineno;
55 PyObject_GC_Track(tb);
56 }
57 return (PyObject *)tb;
58}
59
60/*[clinic input]
61@classmethod
62TracebackType.__new__ as tb_new
63
64 tb_next: object
65 tb_frame: object(type='PyFrameObject *', subclass_of='&PyFrame_Type')
66 tb_lasti: int
67 tb_lineno: int
68
69Create a new traceback object.
70[clinic start generated code]*/
71
72static PyObject *
73tb_new_impl(PyTypeObject *type, PyObject *tb_next, PyFrameObject *tb_frame,
74 int tb_lasti, int tb_lineno)
75/*[clinic end generated code: output=fa077debd72d861a input=01cbe8ec8783fca7]*/
76{
77 if (tb_next == Py_None) {
78 tb_next = NULL;
79 } else if (!PyTraceBack_Check(tb_next)) {
80 return PyErr_Format(PyExc_TypeError,
81 "expected traceback object or None, got '%s'",
82 Py_TYPE(tb_next)->tp_name);
83 }
84
85 return tb_create_raw((PyTracebackObject *)tb_next, tb_frame, tb_lasti,
86 tb_lineno);
87}
88
Collin Winter3eed7652007-08-14 17:53:54 +000089static PyObject *
90tb_dir(PyTracebackObject *self)
91{
92 return Py_BuildValue("[ssss]", "tb_frame", "tb_next",
93 "tb_lasti", "tb_lineno");
94}
95
Nathaniel J. Smithe46a8af2018-01-07 05:30:18 -080096static PyObject *
97tb_next_get(PyTracebackObject *self, void *Py_UNUSED(_))
98{
99 PyObject* ret = (PyObject*)self->tb_next;
100 if (!ret) {
101 ret = Py_None;
102 }
103 Py_INCREF(ret);
104 return ret;
105}
106
107static int
108tb_next_set(PyTracebackObject *self, PyObject *new_next, void *Py_UNUSED(_))
109{
110 if (!new_next) {
111 PyErr_Format(PyExc_TypeError, "can't delete tb_next attribute");
112 return -1;
113 }
114
115 /* We accept None or a traceback object, and map None -> NULL (inverse of
116 tb_next_get) */
117 if (new_next == Py_None) {
118 new_next = NULL;
119 } else if (!PyTraceBack_Check(new_next)) {
120 PyErr_Format(PyExc_TypeError,
121 "expected traceback object, got '%s'",
122 Py_TYPE(new_next)->tp_name);
123 return -1;
124 }
125
126 /* Check for loops */
127 PyTracebackObject *cursor = (PyTracebackObject *)new_next;
128 while (cursor) {
129 if (cursor == self) {
130 PyErr_Format(PyExc_ValueError, "traceback loop detected");
131 return -1;
132 }
133 cursor = cursor->tb_next;
134 }
135
136 PyObject *old_next = (PyObject*)self->tb_next;
137 Py_XINCREF(new_next);
138 self->tb_next = (PyTracebackObject *)new_next;
139 Py_XDECREF(old_next);
140
141 return 0;
142}
143
144
Collin Winter3eed7652007-08-14 17:53:54 +0000145static PyMethodDef tb_methods[] = {
146 {"__dir__", (PyCFunction)tb_dir, METH_NOARGS},
147 {NULL, NULL, 0, NULL},
148};
149
Neal Norwitz8dfc4a92007-08-11 06:39:53 +0000150static PyMemberDef tb_memberlist[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000151 {"tb_frame", T_OBJECT, OFF(tb_frame), READONLY},
152 {"tb_lasti", T_INT, OFF(tb_lasti), READONLY},
153 {"tb_lineno", T_INT, OFF(tb_lineno), READONLY},
154 {NULL} /* Sentinel */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000155};
156
Nathaniel J. Smithe46a8af2018-01-07 05:30:18 -0800157static PyGetSetDef tb_getsetters[] = {
158 {"tb_next", (getter)tb_next_get, (setter)tb_next_set, NULL, NULL},
159 {NULL} /* Sentinel */
160};
161
Guido van Rossum3f5da241990-12-20 15:06:42 +0000162static void
Nicholas Bastina7604bf2004-03-21 18:37:23 +0000163tb_dealloc(PyTracebackObject *tb)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000164{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000165 PyObject_GC_UnTrack(tb);
166 Py_TRASHCAN_SAFE_BEGIN(tb)
167 Py_XDECREF(tb->tb_next);
168 Py_XDECREF(tb->tb_frame);
169 PyObject_GC_Del(tb);
170 Py_TRASHCAN_SAFE_END(tb)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000171}
172
Jeremy Hyltonfd14d8e2001-10-22 22:17:41 +0000173static int
Nicholas Bastina7604bf2004-03-21 18:37:23 +0000174tb_traverse(PyTracebackObject *tb, visitproc visit, void *arg)
Jeremy Hyltonfd14d8e2001-10-22 22:17:41 +0000175{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000176 Py_VISIT(tb->tb_next);
177 Py_VISIT(tb->tb_frame);
178 return 0;
Jeremy Hyltonfd14d8e2001-10-22 22:17:41 +0000179}
180
181static void
Nicholas Bastina7604bf2004-03-21 18:37:23 +0000182tb_clear(PyTracebackObject *tb)
Jeremy Hyltonfd14d8e2001-10-22 22:17:41 +0000183{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 Py_CLEAR(tb->tb_next);
185 Py_CLEAR(tb->tb_frame);
Jeremy Hyltonfd14d8e2001-10-22 22:17:41 +0000186}
187
Tim Petersd7c36522001-10-22 19:34:09 +0000188PyTypeObject PyTraceBack_Type = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000189 PyVarObject_HEAD_INIT(&PyType_Type, 0)
190 "traceback",
191 sizeof(PyTracebackObject),
192 0,
193 (destructor)tb_dealloc, /*tp_dealloc*/
194 0, /*tp_print*/
195 0, /*tp_getattr*/
196 0, /*tp_setattr*/
197 0, /*tp_reserved*/
198 0, /*tp_repr*/
199 0, /*tp_as_number*/
200 0, /*tp_as_sequence*/
201 0, /*tp_as_mapping*/
202 0, /* tp_hash */
203 0, /* tp_call */
204 0, /* tp_str */
205 PyObject_GenericGetAttr, /* tp_getattro */
206 0, /* tp_setattro */
207 0, /* tp_as_buffer */
208 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
Nathaniel J. Smithe46a8af2018-01-07 05:30:18 -0800209 tb_new__doc__, /* tp_doc */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 (traverseproc)tb_traverse, /* tp_traverse */
211 (inquiry)tb_clear, /* tp_clear */
212 0, /* tp_richcompare */
213 0, /* tp_weaklistoffset */
214 0, /* tp_iter */
215 0, /* tp_iternext */
216 tb_methods, /* tp_methods */
217 tb_memberlist, /* tp_members */
Nathaniel J. Smithe46a8af2018-01-07 05:30:18 -0800218 tb_getsetters, /* tp_getset */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000219 0, /* tp_base */
220 0, /* tp_dict */
Nathaniel J. Smithe46a8af2018-01-07 05:30:18 -0800221 0, /* tp_descr_get */
222 0, /* tp_descr_set */
223 0, /* tp_dictoffset */
224 0, /* tp_init */
225 0, /* tp_alloc */
226 tb_new, /* tp_new */
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227};
228
Guido van Rossum3f5da241990-12-20 15:06:42 +0000229int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000230PyTraceBack_Here(PyFrameObject *frame)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000231{
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300232 PyObject *exc, *val, *tb, *newtb;
233 PyErr_Fetch(&exc, &val, &tb);
Nathaniel J. Smithe46a8af2018-01-07 05:30:18 -0800234 newtb = tb_create_raw((PyTracebackObject *)tb, frame, frame->f_lasti,
235 PyFrame_GetLineNumber(frame));
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300236 if (newtb == NULL) {
237 _PyErr_ChainExceptions(exc, val, tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 return -1;
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300239 }
240 PyErr_Restore(exc, val, newtb);
241 Py_XDECREF(tb);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 return 0;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000243}
244
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200245/* Insert a frame into the traceback for (funcname, filename, lineno). */
Serhiy Storchaka73c95f12015-06-21 15:59:46 +0300246void _PyTraceback_Add(const char *funcname, const char *filename, int lineno)
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200247{
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300248 PyObject *globals;
249 PyCodeObject *code;
250 PyFrameObject *frame;
251 PyObject *exc, *val, *tb;
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200252
253 /* Save and clear the current exception. Python functions must not be
254 called with an exception set. Calling Python functions happens when
255 the codec of the filesystem encoding is implemented in pure Python. */
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300256 PyErr_Fetch(&exc, &val, &tb);
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200257
258 globals = PyDict_New();
259 if (!globals)
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300260 goto error;
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200261 code = PyCode_NewEmpty(filename, funcname, lineno);
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300262 if (!code) {
263 Py_DECREF(globals);
264 goto error;
265 }
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200266 frame = PyFrame_New(PyThreadState_Get(), code, globals, NULL);
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300267 Py_DECREF(globals);
268 Py_DECREF(code);
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200269 if (!frame)
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300270 goto error;
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200271 frame->f_lineno = lineno;
272
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300273 PyErr_Restore(exc, val, tb);
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200274 PyTraceBack_Here(frame);
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300275 Py_DECREF(frame);
276 return;
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200277
Serhiy Storchaka04eb7772016-10-18 13:23:18 +0300278error:
279 _PyErr_ChainExceptions(exc, val, tb);
Antoine Pitrou0ddbf472014-10-08 20:00:09 +0200280}
281
Victor Stinner0fe25a42010-06-17 23:08:50 +0000282static PyObject *
283_Py_FindSourceFile(PyObject *filename, char* namebuf, size_t namelen, PyObject *io)
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000284{
Victor Stinner0fe25a42010-06-17 23:08:50 +0000285 Py_ssize_t i;
286 PyObject *binary;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 PyObject *v;
Victor Stinner0fe25a42010-06-17 23:08:50 +0000288 Py_ssize_t npath;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000289 size_t taillen;
290 PyObject *syspath;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000291 PyObject *path;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 const char* tail;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000293 PyObject *filebytes;
Victor Stinner0fe25a42010-06-17 23:08:50 +0000294 const char* filepath;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 Py_ssize_t len;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000296 PyObject* result;
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000297
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000298 filebytes = PyUnicode_EncodeFSDefault(filename);
299 if (filebytes == NULL) {
Victor Stinner0fe25a42010-06-17 23:08:50 +0000300 PyErr_Clear();
301 return NULL;
302 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000303 filepath = PyBytes_AS_STRING(filebytes);
Victor Stinner0fe25a42010-06-17 23:08:50 +0000304
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000305 /* Search tail of filename in sys.path before giving up */
Victor Stinner0fe25a42010-06-17 23:08:50 +0000306 tail = strrchr(filepath, SEP);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 if (tail == NULL)
Victor Stinner0fe25a42010-06-17 23:08:50 +0000308 tail = filepath;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000309 else
310 tail++;
311 taillen = strlen(tail);
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000312
Victor Stinnerbd303c12013-11-07 23:07:29 +0100313 syspath = _PySys_GetObjectId(&PyId_path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 if (syspath == NULL || !PyList_Check(syspath))
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000315 goto error;
Victor Stinner0fe25a42010-06-17 23:08:50 +0000316 npath = PyList_Size(syspath);
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000317
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 for (i = 0; i < npath; i++) {
319 v = PyList_GetItem(syspath, i);
320 if (v == NULL) {
321 PyErr_Clear();
322 break;
323 }
324 if (!PyUnicode_Check(v))
325 continue;
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000326 path = PyUnicode_EncodeFSDefault(v);
Victor Stinner0fe25a42010-06-17 23:08:50 +0000327 if (path == NULL) {
328 PyErr_Clear();
329 continue;
330 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000331 len = PyBytes_GET_SIZE(path);
332 if (len + 1 + (Py_ssize_t)taillen >= (Py_ssize_t)namelen - 1) {
333 Py_DECREF(path);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000334 continue; /* Too long */
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000335 }
336 strcpy(namebuf, PyBytes_AS_STRING(path));
337 Py_DECREF(path);
Victor Stinner98ea54c2014-08-15 23:30:40 +0200338 if (strlen(namebuf) != (size_t)len)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000339 continue; /* v contains '\0' */
340 if (len > 0 && namebuf[len-1] != SEP)
341 namebuf[len++] = SEP;
342 strcpy(namebuf+len, tail);
Victor Stinner0fe25a42010-06-17 23:08:50 +0000343
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200344 binary = _PyObject_CallMethodId(io, &PyId_open, "ss", namebuf, "rb");
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000345 if (binary != NULL) {
346 result = binary;
347 goto finally;
348 }
Victor Stinner0fe25a42010-06-17 23:08:50 +0000349 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 }
Victor Stinner4c7c8c32010-10-16 13:14:10 +0000351 goto error;
352
353error:
354 result = NULL;
355finally:
356 Py_DECREF(filebytes);
357 return result;
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000358}
359
Christian Heimes33fe8092008-04-13 13:53:33 +0000360int
Victor Stinner0fe25a42010-06-17 23:08:50 +0000361_Py_DisplaySourceLine(PyObject *f, PyObject *filename, int lineno, int indent)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000362{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000363 int err = 0;
364 int fd;
365 int i;
366 char *found_encoding;
367 char *encoding;
Victor Stinner0fe25a42010-06-17 23:08:50 +0000368 PyObject *io;
369 PyObject *binary;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000370 PyObject *fob = NULL;
371 PyObject *lineobj = NULL;
Antoine Pitroub86680e2010-10-14 21:15:17 +0000372 PyObject *res;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000373 char buf[MAXPATHLEN+1];
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200374 int kind;
375 void *data;
Christian Heimes679db4a2008-01-18 09:56:22 +0000376
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000377 /* open the file */
378 if (filename == NULL)
379 return 0;
Victor Stinner0fe25a42010-06-17 23:08:50 +0000380
381 io = PyImport_ImportModuleNoBlock("io");
382 if (io == NULL)
383 return -1;
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200384 binary = _PyObject_CallMethodId(io, &PyId_open, "Os", filename, "rb");
Victor Stinner0fe25a42010-06-17 23:08:50 +0000385
386 if (binary == NULL) {
Victor Stinnerceceaa02013-07-16 00:32:14 +0200387 PyErr_Clear();
388
Victor Stinner0fe25a42010-06-17 23:08:50 +0000389 binary = _Py_FindSourceFile(filename, buf, sizeof(buf), io);
390 if (binary == NULL) {
391 Py_DECREF(io);
Victor Stinnerceceaa02013-07-16 00:32:14 +0200392 return -1;
Victor Stinner0fe25a42010-06-17 23:08:50 +0000393 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 }
Christian Heimes33fe8092008-04-13 13:53:33 +0000395
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000396 /* use the right encoding to decode the file as unicode */
Victor Stinner0fe25a42010-06-17 23:08:50 +0000397 fd = PyObject_AsFileDescriptor(binary);
Christian Heimes8c077bc2013-07-21 01:53:10 +0200398 if (fd < 0) {
399 Py_DECREF(io);
400 Py_DECREF(binary);
Benjamin Peterson04b01dc2013-07-21 13:26:13 -0700401 return 0;
Christian Heimes8c077bc2013-07-21 01:53:10 +0200402 }
Victor Stinnerfe7c5b52011-04-05 01:48:03 +0200403 found_encoding = PyTokenizer_FindEncodingFilename(fd, filename);
Victor Stinner5272fa92013-12-19 13:39:32 +0100404 if (found_encoding == NULL)
405 PyErr_Clear();
Victor Stinner0fe25a42010-06-17 23:08:50 +0000406 encoding = (found_encoding != NULL) ? found_encoding : "utf-8";
Christian Heimes1f347292013-07-21 02:12:35 +0200407 /* Reset position */
408 if (lseek(fd, 0, SEEK_SET) == (off_t)-1) {
409 Py_DECREF(io);
410 Py_DECREF(binary);
411 PyMem_FREE(found_encoding);
Benjamin Peterson04b01dc2013-07-21 13:26:13 -0700412 return 0;
Christian Heimes1f347292013-07-21 02:12:35 +0200413 }
Martin v. Löwisafe55bb2011-10-09 10:38:36 +0200414 fob = _PyObject_CallMethodId(io, &PyId_TextIOWrapper, "Os", binary, encoding);
Victor Stinner0fe25a42010-06-17 23:08:50 +0000415 Py_DECREF(io);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 PyMem_FREE(found_encoding);
Victor Stinner0fe25a42010-06-17 23:08:50 +0000417
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 if (fob == NULL) {
419 PyErr_Clear();
Victor Stinner81f241a2015-03-25 02:25:25 +0100420
Victor Stinner3466bde2016-09-05 18:16:01 -0700421 res = _PyObject_CallMethodId(binary, &PyId_close, NULL);
Victor Stinner81f241a2015-03-25 02:25:25 +0100422 Py_DECREF(binary);
423 if (res)
424 Py_DECREF(res);
425 else
426 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000427 return 0;
428 }
Victor Stinner81f241a2015-03-25 02:25:25 +0100429 Py_DECREF(binary);
Christian Heimes33fe8092008-04-13 13:53:33 +0000430
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 /* get the line number lineno */
432 for (i = 0; i < lineno; i++) {
433 Py_XDECREF(lineobj);
434 lineobj = PyFile_GetLine(fob, -1);
435 if (!lineobj) {
Victor Stinner5e78f4d2014-10-30 10:17:27 +0100436 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 err = -1;
438 break;
439 }
440 }
Victor Stinner3466bde2016-09-05 18:16:01 -0700441 res = _PyObject_CallMethodId(fob, &PyId_close, NULL);
Antoine Pitroub86680e2010-10-14 21:15:17 +0000442 if (res)
443 Py_DECREF(res);
444 else
445 PyErr_Clear();
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000446 Py_DECREF(fob);
447 if (!lineobj || !PyUnicode_Check(lineobj)) {
448 Py_XDECREF(lineobj);
449 return err;
450 }
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000451
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 /* remove the indentation of the line */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200453 kind = PyUnicode_KIND(lineobj);
454 data = PyUnicode_DATA(lineobj);
455 for (i=0; i < PyUnicode_GET_LENGTH(lineobj); i++) {
456 Py_UCS4 ch = PyUnicode_READ(kind, data, i);
457 if (ch != ' ' && ch != '\t' && ch != '\014')
458 break;
459 }
460 if (i) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 PyObject *truncated;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200462 truncated = PyUnicode_Substring(lineobj, i, PyUnicode_GET_LENGTH(lineobj));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000463 if (truncated) {
464 Py_DECREF(lineobj);
465 lineobj = truncated;
466 } else {
467 PyErr_Clear();
468 }
469 }
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 /* Write some spaces before the line */
472 strcpy(buf, " ");
473 assert (strlen(buf) == 10);
474 while (indent > 0) {
Benjamin Peterson0f9b7d32013-07-21 13:29:37 -0700475 if (indent < 10)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000476 buf[indent] = '\0';
477 err = PyFile_WriteString(buf, f);
478 if (err != 0)
479 break;
480 indent -= 10;
481 }
Amaury Forgeot d'Arccf8016a2008-10-09 23:37:48 +0000482
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000483 /* finally display the line */
484 if (err == 0)
485 err = PyFile_WriteObject(lineobj, f, Py_PRINT_RAW);
486 Py_DECREF(lineobj);
487 if (err == 0)
488 err = PyFile_WriteString("\n", f);
489 return err;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490}
491
Guido van Rossum7e8d26d1997-05-22 22:35:47 +0000492static int
Victor Stinner0fe25a42010-06-17 23:08:50 +0000493tb_displayline(PyObject *f, PyObject *filename, int lineno, PyObject *name)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000494{
Victor Stinner0fe25a42010-06-17 23:08:50 +0000495 int err;
496 PyObject *line;
Christian Heimes33fe8092008-04-13 13:53:33 +0000497
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 if (filename == NULL || name == NULL)
499 return -1;
Victor Stinner0fe25a42010-06-17 23:08:50 +0000500 line = PyUnicode_FromFormat(" File \"%U\", line %d, in %U\n",
501 filename, lineno, name);
502 if (line == NULL)
503 return -1;
504 err = PyFile_WriteObject(line, f, Py_PRINT_RAW);
505 Py_DECREF(line);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000506 if (err != 0)
507 return err;
Kristján Valur Jónssonc5963d32012-07-19 21:02:03 +0000508 /* ignore errors since we can't report them, can we? */
509 if (_Py_DisplaySourceLine(f, filename, lineno, 4))
510 PyErr_Clear();
511 return err;
Christian Heimes33fe8092008-04-13 13:53:33 +0000512}
513
514static int
Serhiy Storchakaedad8ee2017-11-15 17:38:52 +0200515tb_print_line_repeated(PyObject *f, long cnt)
516{
517 int err;
518 PyObject *line = PyUnicode_FromFormat(
519 " [Previous line repeated %ld more times]\n", cnt-3);
520 if (line == NULL) {
521 return -1;
522 }
523 err = PyFile_WriteObject(line, f, Py_PRINT_RAW);
524 Py_DECREF(line);
525 return err;
526}
527
528static int
Christian Heimes33fe8092008-04-13 13:53:33 +0000529tb_printinternal(PyTracebackObject *tb, PyObject *f, long limit)
530{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000531 int err = 0;
Serhiy Storchakaedad8ee2017-11-15 17:38:52 +0200532 Py_ssize_t depth = 0;
Nick Coghland0034232016-08-15 13:11:34 +1000533 PyObject *last_file = NULL;
534 int last_line = -1;
535 PyObject *last_name = NULL;
536 long cnt = 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000537 PyTracebackObject *tb1 = tb;
538 while (tb1 != NULL) {
539 depth++;
540 tb1 = tb1->tb_next;
541 }
Serhiy Storchakaedad8ee2017-11-15 17:38:52 +0200542 while (tb != NULL && depth > limit) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 depth--;
544 tb = tb->tb_next;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 }
Serhiy Storchakaedad8ee2017-11-15 17:38:52 +0200546 while (tb != NULL && err == 0) {
547 if (last_file != NULL &&
548 tb->tb_frame->f_code->co_filename == last_file &&
549 last_line != -1 && tb->tb_lineno == last_line &&
550 last_name != NULL && tb->tb_frame->f_code->co_name == last_name)
551 {
552 cnt++;
553 }
554 else {
555 if (cnt > 3) {
556 err = tb_print_line_repeated(f, cnt);
557 }
558 last_file = tb->tb_frame->f_code->co_filename;
559 last_line = tb->tb_lineno;
560 last_name = tb->tb_frame->f_code->co_name;
561 cnt = 0;
562 }
563 if (err == 0 && cnt < 3) {
564 err = tb_displayline(f,
565 tb->tb_frame->f_code->co_filename,
566 tb->tb_lineno,
567 tb->tb_frame->f_code->co_name);
568 if (err == 0) {
569 err = PyErr_CheckSignals();
570 }
571 }
572 tb = tb->tb_next;
573 }
574 if (err == 0 && cnt > 3) {
575 err = tb_print_line_repeated(f, cnt);
Nick Coghland0034232016-08-15 13:11:34 +1000576 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 return err;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000578}
579
Christian Heimes0fbab7f2007-12-04 21:55:18 +0000580#define PyTraceBack_LIMIT 1000
581
Guido van Rossum3f5da241990-12-20 15:06:42 +0000582int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000583PyTraceBack_Print(PyObject *v, PyObject *f)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000584{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000585 int err;
586 PyObject *limitv;
587 long limit = PyTraceBack_LIMIT;
Christian Heimes0fbab7f2007-12-04 21:55:18 +0000588
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 if (v == NULL)
590 return 0;
591 if (!PyTraceBack_Check(v)) {
592 PyErr_BadInternalCall();
593 return -1;
594 }
595 limitv = PySys_GetObject("tracebacklimit");
Serhiy Storchakaedad8ee2017-11-15 17:38:52 +0200596 if (limitv && PyLong_Check(limitv)) {
597 int overflow;
598 limit = PyLong_AsLongAndOverflow(limitv, &overflow);
599 if (overflow > 0) {
600 limit = LONG_MAX;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000601 }
602 else if (limit <= 0) {
Serhiy Storchakaedad8ee2017-11-15 17:38:52 +0200603 return 0;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000605 }
606 err = PyFile_WriteString("Traceback (most recent call last):\n", f);
607 if (!err)
608 err = tb_printinternal((PyTracebackObject *)v, f, limit);
609 return err;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000610}
Victor Stinner024e37a2011-03-31 01:31:06 +0200611
612/* Reverse a string. For example, "abcd" becomes "dcba".
613
614 This function is signal safe. */
615
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100616void
617_Py_DumpDecimal(int fd, unsigned long value)
Victor Stinner024e37a2011-03-31 01:31:06 +0200618{
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100619 /* maximum number of characters required for output of %lld or %p.
620 We need at most ceil(log10(256)*SIZEOF_LONG_LONG) digits,
621 plus 1 for the null byte. 53/22 is an upper bound for log10(256). */
622 char buffer[1 + (sizeof(unsigned long)*53-1) / 22 + 1];
623 char *ptr, *end;
Victor Stinner024e37a2011-03-31 01:31:06 +0200624
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100625 end = &buffer[Py_ARRAY_LENGTH(buffer) - 1];
626 ptr = end;
627 *ptr = '\0';
Victor Stinner024e37a2011-03-31 01:31:06 +0200628 do {
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100629 --ptr;
630 assert(ptr >= buffer);
631 *ptr = '0' + (value % 10);
Victor Stinner024e37a2011-03-31 01:31:06 +0200632 value /= 10;
Victor Stinner024e37a2011-03-31 01:31:06 +0200633 } while (value);
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100634
635 _Py_write_noraise(fd, ptr, end - ptr);
Victor Stinner024e37a2011-03-31 01:31:06 +0200636}
637
Guido van Rossum7be5d7d2013-10-20 18:21:02 -0700638/* Format an integer in range [0; 0xffffffff] to hexadecimal of 'width' digits,
Victor Stinner024e37a2011-03-31 01:31:06 +0200639 and write it into the file fd.
640
641 This function is signal safe. */
642
Victor Stinnerbd31b7c2016-03-23 10:32:26 +0100643void
644_Py_DumpHexadecimal(int fd, unsigned long value, Py_ssize_t width)
Victor Stinner024e37a2011-03-31 01:31:06 +0200645{
Victor Stinner013024e2016-03-16 09:43:14 +0100646 char buffer[sizeof(unsigned long) * 2 + 1], *ptr, *end;
647 const Py_ssize_t size = Py_ARRAY_LENGTH(buffer) - 1;
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100648
649 if (width > size)
650 width = size;
Victor Stinnerbd31b7c2016-03-23 10:32:26 +0100651 /* it's ok if width is negative */
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100652
Victor Stinner013024e2016-03-16 09:43:14 +0100653 end = &buffer[size];
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100654 ptr = end;
655 *ptr = '\0';
Victor Stinner024e37a2011-03-31 01:31:06 +0200656 do {
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100657 --ptr;
658 assert(ptr >= buffer);
659 *ptr = Py_hexdigits[value & 15];
Victor Stinner024e37a2011-03-31 01:31:06 +0200660 value >>= 4;
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100661 } while ((end - ptr) < width || value);
662
663 _Py_write_noraise(fd, ptr, end - ptr);
Victor Stinner024e37a2011-03-31 01:31:06 +0200664}
665
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100666void
667_Py_DumpASCII(int fd, PyObject *text)
Victor Stinner024e37a2011-03-31 01:31:06 +0200668{
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200669 PyASCIIObject *ascii = (PyASCIIObject *)text;
Victor Stinner024e37a2011-03-31 01:31:06 +0200670 Py_ssize_t i, size;
671 int truncated;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200672 int kind;
Victor Stinnera336de72011-10-05 22:44:12 +0200673 void *data = NULL;
674 wchar_t *wstr = NULL;
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200675 Py_UCS4 ch;
Victor Stinner024e37a2011-03-31 01:31:06 +0200676
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100677 if (!PyUnicode_Check(text))
678 return;
679
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200680 size = ascii->length;
681 kind = ascii->state.kind;
Victor Stinner1c3069a2016-03-23 16:10:07 +0100682 if (kind == PyUnicode_WCHAR_KIND) {
683 wstr = ((PyASCIIObject *)text)->wstr;
684 if (wstr == NULL)
685 return;
686 size = ((PyCompactUnicodeObject *)text)->wstr_length;
687 }
688 else if (ascii->state.compact) {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200689 if (ascii->state.ascii)
690 data = ((PyASCIIObject*)text) + 1;
691 else
692 data = ((PyCompactUnicodeObject*)text) + 1;
693 }
Victor Stinner1c3069a2016-03-23 16:10:07 +0100694 else {
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200695 data = ((PyUnicodeObject *)text)->data.any;
696 if (data == NULL)
697 return;
698 }
Victor Stinner024e37a2011-03-31 01:31:06 +0200699
700 if (MAX_STRING_LENGTH < size) {
701 size = MAX_STRING_LENGTH;
702 truncated = 1;
703 }
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100704 else {
Victor Stinner024e37a2011-03-31 01:31:06 +0200705 truncated = 0;
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100706 }
Victor Stinner024e37a2011-03-31 01:31:06 +0200707
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200708 for (i=0; i < size; i++) {
Victor Stinnera336de72011-10-05 22:44:12 +0200709 if (kind != PyUnicode_WCHAR_KIND)
710 ch = PyUnicode_READ(kind, data, i);
711 else
712 ch = wstr[i];
Victor Stinnerb86f08f2014-10-03 14:18:09 +0200713 if (' ' <= ch && ch <= 126) {
714 /* printable ASCII character */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200715 char c = (char)ch;
Victor Stinner97f86b82015-04-01 18:38:01 +0200716 _Py_write_noraise(fd, &c, 1);
Victor Stinner024e37a2011-03-31 01:31:06 +0200717 }
Victor Stinnerb86f08f2014-10-03 14:18:09 +0200718 else if (ch <= 0xff) {
Victor Stinner024e37a2011-03-31 01:31:06 +0200719 PUTS(fd, "\\x");
Victor Stinnerbd31b7c2016-03-23 10:32:26 +0100720 _Py_DumpHexadecimal(fd, ch, 2);
Victor Stinner024e37a2011-03-31 01:31:06 +0200721 }
Victor Stinnerb86f08f2014-10-03 14:18:09 +0200722 else if (ch <= 0xffff) {
Victor Stinner024e37a2011-03-31 01:31:06 +0200723 PUTS(fd, "\\u");
Victor Stinnerbd31b7c2016-03-23 10:32:26 +0100724 _Py_DumpHexadecimal(fd, ch, 4);
Victor Stinner024e37a2011-03-31 01:31:06 +0200725 }
726 else {
727 PUTS(fd, "\\U");
Victor Stinnerbd31b7c2016-03-23 10:32:26 +0100728 _Py_DumpHexadecimal(fd, ch, 8);
Victor Stinner024e37a2011-03-31 01:31:06 +0200729 }
730 }
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100731 if (truncated) {
Victor Stinner024e37a2011-03-31 01:31:06 +0200732 PUTS(fd, "...");
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100733 }
Victor Stinner024e37a2011-03-31 01:31:06 +0200734}
735
736/* Write a frame into the file fd: "File "xxx", line xxx in xxx".
737
738 This function is signal safe. */
739
740static void
741dump_frame(int fd, PyFrameObject *frame)
742{
743 PyCodeObject *code;
744 int lineno;
745
746 code = frame->f_code;
747 PUTS(fd, " File ");
748 if (code != NULL && code->co_filename != NULL
749 && PyUnicode_Check(code->co_filename))
750 {
Victor Stinner97f86b82015-04-01 18:38:01 +0200751 PUTS(fd, "\"");
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100752 _Py_DumpASCII(fd, code->co_filename);
Victor Stinner97f86b82015-04-01 18:38:01 +0200753 PUTS(fd, "\"");
Victor Stinner024e37a2011-03-31 01:31:06 +0200754 } else {
755 PUTS(fd, "???");
756 }
757
758 /* PyFrame_GetLineNumber() was introduced in Python 2.7.0 and 3.2.0 */
Martin v. Löwisd63a3b82011-09-28 07:41:54 +0200759 lineno = PyCode_Addr2Line(code, frame->f_lasti);
Victor Stinner024e37a2011-03-31 01:31:06 +0200760 PUTS(fd, ", line ");
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100761 if (lineno >= 0) {
762 _Py_DumpDecimal(fd, (unsigned long)lineno);
763 }
764 else {
765 PUTS(fd, "???");
766 }
Victor Stinner024e37a2011-03-31 01:31:06 +0200767 PUTS(fd, " in ");
768
769 if (code != NULL && code->co_name != NULL
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100770 && PyUnicode_Check(code->co_name)) {
771 _Py_DumpASCII(fd, code->co_name);
772 }
773 else {
Victor Stinner024e37a2011-03-31 01:31:06 +0200774 PUTS(fd, "???");
Victor Stinner89e7cdc2016-03-15 21:49:37 +0100775 }
Victor Stinner024e37a2011-03-31 01:31:06 +0200776
Victor Stinner97f86b82015-04-01 18:38:01 +0200777 PUTS(fd, "\n");
Victor Stinner024e37a2011-03-31 01:31:06 +0200778}
779
Victor Stinnerfcb88c42011-04-01 15:34:01 +0200780static void
Victor Stinner024e37a2011-03-31 01:31:06 +0200781dump_traceback(int fd, PyThreadState *tstate, int write_header)
782{
783 PyFrameObject *frame;
784 unsigned int depth;
785
Victor Stinner024e37a2011-03-31 01:31:06 +0200786 if (write_header)
Guido van Rossum7be5d7d2013-10-20 18:21:02 -0700787 PUTS(fd, "Stack (most recent call first):\n");
Victor Stinnerfcb88c42011-04-01 15:34:01 +0200788
789 frame = _PyThreadState_GetFrame(tstate);
790 if (frame == NULL)
791 return;
792
Victor Stinner024e37a2011-03-31 01:31:06 +0200793 depth = 0;
794 while (frame != NULL) {
795 if (MAX_FRAME_DEPTH <= depth) {
796 PUTS(fd, " ...\n");
797 break;
798 }
799 if (!PyFrame_Check(frame))
800 break;
801 dump_frame(fd, frame);
802 frame = frame->f_back;
803 depth++;
804 }
Victor Stinner024e37a2011-03-31 01:31:06 +0200805}
806
Victor Stinner97f86b82015-04-01 18:38:01 +0200807/* Dump the traceback of a Python thread into fd. Use write() to write the
808 traceback and retry if write() is interrupted by a signal (failed with
809 EINTR), but don't call the Python signal handler.
810
811 The caller is responsible to call PyErr_CheckSignals() to call Python signal
812 handlers if signals were received. */
Victor Stinnerfcb88c42011-04-01 15:34:01 +0200813void
Victor Stinner024e37a2011-03-31 01:31:06 +0200814_Py_DumpTraceback(int fd, PyThreadState *tstate)
815{
Victor Stinnerfcb88c42011-04-01 15:34:01 +0200816 dump_traceback(fd, tstate, 1);
Victor Stinner024e37a2011-03-31 01:31:06 +0200817}
818
819/* Write the thread identifier into the file 'fd': "Current thread 0xHHHH:\" if
820 is_current is true, "Thread 0xHHHH:\n" otherwise.
821
822 This function is signal safe. */
823
824static void
825write_thread_id(int fd, PyThreadState *tstate, int is_current)
826{
827 if (is_current)
828 PUTS(fd, "Current thread 0x");
829 else
830 PUTS(fd, "Thread 0x");
Victor Stinnerbd31b7c2016-03-23 10:32:26 +0100831 _Py_DumpHexadecimal(fd,
Serhiy Storchakaaefa7eb2017-03-23 15:48:39 +0200832 tstate->thread_id,
Victor Stinnerbd31b7c2016-03-23 10:32:26 +0100833 sizeof(unsigned long) * 2);
Guido van Rossum7be5d7d2013-10-20 18:21:02 -0700834 PUTS(fd, " (most recent call first):\n");
Victor Stinner024e37a2011-03-31 01:31:06 +0200835}
836
Victor Stinner97f86b82015-04-01 18:38:01 +0200837/* Dump the traceback of all Python threads into fd. Use write() to write the
838 traceback and retry if write() is interrupted by a signal (failed with
839 EINTR), but don't call the Python signal handler.
840
841 The caller is responsible to call PyErr_CheckSignals() to call Python signal
842 handlers if signals were received. */
Victor Stinner024e37a2011-03-31 01:31:06 +0200843const char*
844_Py_DumpTracebackThreads(int fd, PyInterpreterState *interp,
Victor Stinner861d9ab2016-03-16 22:45:24 +0100845 PyThreadState *current_tstate)
Victor Stinner024e37a2011-03-31 01:31:06 +0200846{
847 PyThreadState *tstate;
848 unsigned int nthreads;
849
Victor Stinner861d9ab2016-03-16 22:45:24 +0100850 if (current_tstate == NULL) {
851 /* _Py_DumpTracebackThreads() is called from signal handlers by
852 faulthandler.
853
854 SIGSEGV, SIGFPE, SIGABRT, SIGBUS and SIGILL are synchronous signals
855 and are thus delivered to the thread that caused the fault. Get the
856 Python thread state of the current thread.
857
858 PyThreadState_Get() doesn't give the state of the thread that caused
859 the fault if the thread released the GIL, and so this function
Masayuki Yamamoto731e1892017-10-06 19:41:34 +0900860 cannot be used. Read the thread specific storage (TSS) instead: call
Victor Stinner861d9ab2016-03-16 22:45:24 +0100861 PyGILState_GetThisThreadState(). */
862 current_tstate = PyGILState_GetThisThreadState();
863 }
864
865 if (interp == NULL) {
866 if (current_tstate == NULL) {
867 interp = _PyGILState_GetInterpreterStateUnsafe();
868 if (interp == NULL) {
869 /* We need the interpreter state to get Python threads */
870 return "unable to get the interpreter state";
871 }
872 }
873 else {
874 interp = current_tstate->interp;
875 }
876 }
Victor Stinner861d9ab2016-03-16 22:45:24 +0100877 assert(interp != NULL);
878
Victor Stinner024e37a2011-03-31 01:31:06 +0200879 /* Get the current interpreter from the current thread */
880 tstate = PyInterpreterState_ThreadHead(interp);
881 if (tstate == NULL)
882 return "unable to get the thread head state";
883
884 /* Dump the traceback of each thread */
885 tstate = PyInterpreterState_ThreadHead(interp);
886 nthreads = 0;
Steve Dower8fc89802015-04-12 00:26:27 -0400887 _Py_BEGIN_SUPPRESS_IPH
Victor Stinner024e37a2011-03-31 01:31:06 +0200888 do
889 {
890 if (nthreads != 0)
Victor Stinner97f86b82015-04-01 18:38:01 +0200891 PUTS(fd, "\n");
Victor Stinner024e37a2011-03-31 01:31:06 +0200892 if (nthreads >= MAX_NTHREADS) {
893 PUTS(fd, "...\n");
894 break;
895 }
Victor Stinner861d9ab2016-03-16 22:45:24 +0100896 write_thread_id(fd, tstate, tstate == current_tstate);
Victor Stinner024e37a2011-03-31 01:31:06 +0200897 dump_traceback(fd, tstate, 0);
898 tstate = PyThreadState_Next(tstate);
899 nthreads++;
900 } while (tstate != NULL);
Steve Dower8fc89802015-04-12 00:26:27 -0400901 _Py_END_SUPPRESS_IPH
Victor Stinner024e37a2011-03-31 01:31:06 +0200902
903 return NULL;
904}
905