gh-123967: Fix faulthandler for trampoline frames (#127329)

If the top-most frame is a trampoline frame, skip it.
This commit is contained in:
Victor Stinner 2024-11-27 16:14:49 +01:00 committed by GitHub
parent 9328db7652
commit 58e334e143
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 16 additions and 9 deletions

View file

@ -0,0 +1,2 @@
Fix faulthandler for trampoline frames. If the top-most frame is a
trampoline frame, skip it. Patch by Victor Stinner.

View file

@ -890,6 +890,8 @@ done:
static void static void
dump_frame(int fd, _PyInterpreterFrame *frame) dump_frame(int fd, _PyInterpreterFrame *frame)
{ {
assert(frame->owner != FRAME_OWNED_BY_CSTACK);
PyCodeObject *code =_PyFrame_GetCode(frame); PyCodeObject *code =_PyFrame_GetCode(frame);
PUTS(fd, " File "); PUTS(fd, " File ");
if (code->co_filename != NULL if (code->co_filename != NULL
@ -963,6 +965,17 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)
unsigned int depth = 0; unsigned int depth = 0;
while (1) { while (1) {
if (frame->owner == FRAME_OWNED_BY_CSTACK) {
/* Trampoline frame */
frame = frame->previous;
if (frame == NULL) {
break;
}
/* Can't have more than one shim frame in a row */
assert(frame->owner != FRAME_OWNED_BY_CSTACK);
}
if (MAX_FRAME_DEPTH <= depth) { if (MAX_FRAME_DEPTH <= depth) {
if (MAX_FRAME_DEPTH < depth) { if (MAX_FRAME_DEPTH < depth) {
PUTS(fd, "plus "); PUTS(fd, "plus ");
@ -971,20 +984,12 @@ dump_traceback(int fd, PyThreadState *tstate, int write_header)
} }
break; break;
} }
dump_frame(fd, frame); dump_frame(fd, frame);
frame = frame->previous; frame = frame->previous;
if (frame == NULL) { if (frame == NULL) {
break; break;
} }
if (frame->owner == FRAME_OWNED_BY_CSTACK) {
/* Trampoline frame */
frame = frame->previous;
}
if (frame == NULL) {
break;
}
/* Can't have more than one shim frame in a row */
assert(frame->owner != FRAME_OWNED_BY_CSTACK);
depth++; depth++;
} }
} }