classification
Title: LLTRACE segv
Type: crash Stage: resolved
Components: Interpreter Core Versions: Python 2.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: petr.viktorin, vandyswa, vstinner
Priority: normal Keywords: patch

Created on 2018-07-14 20:54 by vandyswa, last changed 2018-07-31 20:58 by vstinner. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 8517 merged python-dev, 2018-07-28 10:40
Messages (5)
msg321661 - (view) Author: Andrew Valencia (vandyswa) Date: 2018-07-14 20:54
Build with -DLLTRACE, then:

>>> __lltrace__ = 1
>>> a = [1, 2, 3]
0: 100, 0
push 1
3: 100, 1
push 2
6: 100, 2
push 3
9: 103, 3
pop 3
pop 2
pop 1
push [1, 2, 3]
12: 90, 0
pop [1, 2, 3]
15: 100, 3
push None
18: 83
pop None

>>> a[0] = 1
0: 100, 0
push 1
3: 101, 0
push [1, 2, 3]
6: 100, 1
push 0
9: 60Program received signal SIGSEGV, Segmentation fault.
0x004535ae in internal_print (op=0x84002364, fp=0xb7f3bd60 <_IO_2_1_stdout_>,
    flags=0, nesting=0) at Objects/object.c:293
293             if (op->ob_refcnt <= 0)
(gdb) bt
#0  0x004535ae in internal_print (op=0x84002364,
    fp=0xb7f3bd60 <_IO_2_1_stdout_>, flags=0, nesting=0)
    at Objects/object.c:293
#1  0x0045370a in PyObject_Print (op=0x84002364,
    fp=0xb7f3bd60 <_IO_2_1_stdout_>, flags=0) at Objects/object.c:330
#2  0x004ada11 in prtrace (v=0x84002364, str=0x54b61d "stackadj")
    at Python/ceval.c:3979
#3  0x004a505b in PyEval_EvalFrameEx (f=0xb7d11994, throwflag=0)
    at Python/ceval.c:1919
#4  0x004ace97 in PyEval_EvalCodeEx (co=0xb7ce7bf0, globals=0xb7d7c714,
    locals=0xb7d7c714, args=0x0, argcount=0, kws=0x0, kwcount=0, defs=0x0,
    defcount=0, closure=0x0) at Python/ceval.c:3604
#5  0x004a0671 in PyEval_EvalCode (co=0xb7ce7bf0, globals=0xb7d7c714,
    locals=0xb7d7c714) at Python/ceval.c:669
#6  0x004d26ab in run_mod (mod=0x646d78, filename=0x53ddfe "<stdin>",
    globals=0xb7d7c714, locals=0xb7d7c714, flags=0xbffff568, arena=0x5f2b10)
    at Python/pythonrun.c:1385
#7  0x004d1106 in PyRun_InteractiveOneFlags (fp=0xb7f3b5a0 <_IO_2_1_stdin_>,
    filename=0x53ddfe "<stdin>", flags=0xbffff568) at Python/pythonrun.c:866
#8  0x004d0e72 in PyRun_InteractiveLoopFlags (fp=0xb7f3b5a0 <_IO_2_1_stdin_>,
    filename=0x53ddfe "<stdin>", flags=0xbffff568) at Python/pythonrun.c:786
#9  0x004d0d1a in PyRun_AnyFileExFlags (fp=0xb7f3b5a0 <_IO_2_1_stdin_>,
    filename=0x53ddfe "<stdin>", closeit=0, flags=0xbffff568)
    at Python/pythonrun.c:755
#10 0x0041d798 in Py_Main (argc=1, argv=0xbffff694) at Modules/main.c:645
#11 0x0041c5eb in main (argc=1, argv=0xbffff694) at ./Modules/python.c:20
msg322559 - (view) Author: Petr Viktorin (petr.viktorin) * (Python committer) Date: 2018-07-28 13:18
The problem here is that tracing for STACKADJ prints out the top of the stack *after* adjustment. This is OK for growing the stack, but not for shrinking it (e.g. calling STACKADJ(-3) pops off three things at once, which can leave TOP undefined when it's printed out).

On the EuroPython sprints, I recommended splitting STACKADJ into STACKADJ_GROW and STACKADJ_SHRINK, since the printing behavior should be different.
This is performance-critical code; it needs to be reviewed carefully.
msg322817 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2018-07-31 20:47
By the way, see also bpo-25571.
msg322819 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2018-07-31 20:55
New changeset 8ed317f1ca42a43df14282bbc3ccc0b5610432f4 by Victor Stinner (costypetrisor) in branch 'master':
bpo-34113: Fix a crash when using LLTRACE is on (GH-8517)
https://github.com/python/cpython/commit/8ed317f1ca42a43df14282bbc3ccc0b5610432f4
msg322820 - (view) Author: STINNER Victor (vstinner) * (Python committer) Date: 2018-07-31 20:58
Thanks Constantin Petrisor to fix and thanks Andrew Valencia for the bug report!

It was the first time that I see a bug report on LLTRACE on the last 5 years, it seems like almost no one uses it. Likely because you need to compile Python manually (or find a binary compiled in debug mode). So I don't think that it's worth it to backport the fix to 2.7, 3.6 and 3.7 branches. I'm not comfortable to modify ceval.c in stable branches.
History
Date User Action Args
2018-07-31 20:58:45vstinnersetstatus: open -> closed
resolution: fixed
messages: + msg322820

stage: patch review -> resolved
2018-07-31 20:55:17vstinnersetmessages: + msg322819
2018-07-31 20:47:19vstinnersetnosy: + vstinner
messages: + msg322817
2018-07-28 13:18:32petr.viktorinsetmessages: + msg322559
2018-07-28 13:10:52petr.viktorinsetnosy: + petr.viktorin
2018-07-28 10:40:46python-devsetkeywords: + patch
stage: patch review
pull_requests: + pull_request8033
2018-07-14 20:54:22vandyswacreate