gh-123967: Fix faulthandler for trampoline frames (#127329) · python/cpython@58e334e

GitHub

@@ -890,6 +890,8 @@ _Py_DumpASCII(int fd, PyObject *text)

890890staticvoid

891891dump_frame(intfd, _PyInterpreterFrame*frame)

892892{

893+assert(frame->owner!=FRAME_OWNED_BY_CSTACK);

894+893895PyCodeObject*code=_PyFrame_GetCode(frame);

894896PUTS(fd, " File ");

895897if (code->co_filename!=NULL

@@ -963,6 +965,17 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)

963965964966unsigned intdepth=0;

965967while (1) {

968+if (frame->owner==FRAME_OWNED_BY_CSTACK) {

969+/* Trampoline frame */

970+frame=frame->previous;

971+if (frame==NULL) {

972+break;

973+ }

974+975+/* Can't have more than one shim frame in a row */

976+assert(frame->owner!=FRAME_OWNED_BY_CSTACK);

977+ }

978+966979if (MAX_FRAME_DEPTH <= depth) {

967980if (MAX_FRAME_DEPTH<depth) {

968981PUTS(fd, "plus ");

@@ -971,20 +984,12 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)

971984 }

972985break;

973986 }

987+974988dump_frame(fd, frame);

975989frame=frame->previous;

976990if (frame==NULL) {

977991break;

978992 }

979-if (frame->owner==FRAME_OWNED_BY_CSTACK) {

980-/* Trampoline frame */

981-frame=frame->previous;

982- }

983-if (frame==NULL) {

984-break;

985- }

986-/* Can't have more than one shim frame in a row */

987-assert(frame->owner!=FRAME_OWNED_BY_CSTACK);

988993depth++;

989994 }

990995}