【问题标题】:Python interpreter segfaultPython解释器段错误
【发布时间】:2016-05-24 12:02:19
【问题描述】:

我有一个奇怪的问题,当我运行 python shell 时:

$ python3

Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> print('Hello') # Error appears for any command in shell

[1]    9021 segmentation fault  python3

但是当我运行python3 hello.py 时,它可以工作。

我已经尝试过python2.7、python3.4和python3.5,得到了同样的错误。

操作系统 Debian 8.4

更新 1

journalctl 输出:

-- Logs begin at нд 2016-05-22 14:57:54 EEST, end at вт 2016-05-24 15:56:53 EEST. --
тра 24 15:56:53 desktop kernel: python[21150]: segfault at 0 ip           (null) sp 00007ffda62fe218 error 14 in python3[400000+3b2000]

更新 2

问题仍未解决,但我发现如果我以其他用户身份运行它,它可以正常工作。我已经尝试删除 .cache 和一些与 python 相关的目录 (.jupyter, .ipython),但没有结果。

更新 3

GDB 输出

gdb python
GNU gdb (Debian 7.7.1+dfsg-5) 7.7.1
Copyright (C) 2014 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from python...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/python 
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Python 2.7.9 (default, Mar  1 2015, 12:57:24) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello")


Program received signal SIGSEGV, Segmentation fault.
0x0000000000000000 in ?? ()
(gdb) 
(gdb) backtrace
#0  0x0000000000000000 in ?? ()
#1  0x00007ffff694892e in rl_callback_read_char () from /lib/x86_64-linux-gnu/libreadline.so.6
#2  0x00007ffff6b67cd5 in ?? () from /usr/lib/python2.7/lib-dynload/readline.x86_64-linux-gnu.so
#3  0x0000000000449d88 in PyOS_Readline ()
#4  0x0000000000422d2a in ?? ()
#5  0x00000000004c4e8a in ?? ()
#6  0x00000000004c460e in PyParser_ASTFromFile ()
#7  0x0000000000449b11 in PyRun_InteractiveOneFlags ()
#8  0x0000000000449937 in PyRun_InteractiveLoopFlags ()
#9  0x000000000042d96b in ?? ()
#10 0x00000000004982f2 in Py_Main ()
#11 0x00007ffff6f12b45 in __libc_start_main (main=0x497d80 <main>, argc=1, argv=0x7fffffffe748, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffe738) at libc-start.c:287
#12 0x0000000000497ca0 in _start ()
(gdb) 

更新 4

以下操作的 Strace 调试:

python
Python 2.7.9 (default, Mar  1 2015, 12:57:24) 
[GCC 4.9.2] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> print("Hello")

[1]    17271 segmentation fault  python

和strace日志:

 strace -p 17271
Process 17271 attached
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], 0}, 8) = 0
read(0, "p", 1)                         = 1
write(1, "p", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "r", 1)                         = 1
write(1, "r", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "i", 1)                         = 1
write(1, "i", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "n", 1)                         = 1
write(1, "n", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "t", 1)                         = 1
write(1, "t", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "(", 1)                         = 1
write(1, "(", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, ")", 1)                         = 1
write(1, ")", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "\33", 1)                       = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "[", 1)                         = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "D", 1)                         = 1
write(1, "\10", 1)                      = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "\"", 1)                        = 1
write(1, "\")\10", 3)                   = 3
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "\"", 1)                        = 1
write(1, "\")\10", 3)                   = 3
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "\33", 1)                       = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "[", 1)                         = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "D", 1)                         = 1
write(1, "\10", 1)                      = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "H", 1)                         = 1
write(1, "H\")\10\10", 5)               = 5
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "e", 1)                         = 1
write(1, "e\")\10\10", 5)               = 5
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "l", 1)                         = 1
write(1, "l\")\10\10", 5)               = 5
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "l", 1)                         = 1
write(1, "l\")\10\10", 5)               = 5
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "o", 1)                         = 1
write(1, "o\")\10\10", 5)               = 5
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "\r", 1)                        = 1
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, NULL, NULL)        = 1 (in [0])
rt_sigaction(SIGWINCH, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, 8) = 0
read(0, "\r", 1)                        = 1
write(1, "\n", 1)                       = 1
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
ioctl(0, SNDCTL_TMR_STOP or SNDRV_TIMER_IOCTL_GINFO or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
ioctl(0, SNDCTL_TMR_TIMEBASE or SNDRV_TIMER_IOCTL_NEXT_DEVICE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
rt_sigaction(SIGWINCH, {SIG_DFL, [], SA_RESTORER, 0x7fd9005a58d0}, {0x7fd8ff2f8270, [], SA_RESTORER|SA_RESTART, 0x7fd9005a58d0}, 8) = 0
select(1, [0], NULL, [0], {0, 500000})  = 0 (Timeout)
write(1, "\n", 1)                       = 1
--- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=0} ---
+++ killed by SIGSEGV +++

更新 5

环境变量差异(适用于 root 用户):

更新 6

作为普通用户:

ldd /usr/bin/python
    linux-vdso.so.1 (0x00007ffcb1648000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f316da1d000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f316d815000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f316d60d000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f316d3ed000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f316d0e5000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f316cd35000)
    /lib64/ld-linux-x86-64.so.2 (0x000055ca7cb3e000)

作为根用户:

ldd /usr/bin/python
    linux-vdso.so.1 (0x00007fffc8ef0000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f79bf425000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f79bf21d000)
    libutil.so.1 => /lib/x86_64-linux-gnu/libutil.so.1 (0x00007f79bf015000)
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f79bedf5000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f79beaed000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f79be73d000)
    /lib64/ld-linux-x86-64.so.2 (0x00005600afb99000)

【问题讨论】:

  • 我添加了一些关闭的东西,问题是,由于某种神秘的原因,/usr/lib/ 中的一些 .pyc 文件已损坏。删除它们都解决了问题。
  • 你检查过 shell 变量 $PYTHONPATH 和 $PYTHONSTARTUP 吗?也许他们指向一些带有讨厌 *.pyc 的目录?
  • 这可能是python外部的问题吗?您是否尝试过使用不同的 shell 或终端程序?如果你用gdb 运行python,你会得到什么输出?
  • 因为同一个 python 正在另一个用户的帐户上工作,也许比较环境变量会给出一些提示?作为 user1: env > /tmp/user1env.txt 然后作为 user2: env > /tmp/user2env.txt 然后,d​​iff....
  • 程序在尝试打印到 stdout 时崩溃 - 请参阅 strace 输出中段错误之前的最后一行 - 是否为该用户启用了任何 MAC 类型的安全控件,可能会阻止其写入 stdout?

标签: python segmentation-fault debian python-interactive


【解决方案1】:

所以,经过一些调试(虽然 cmets 现在看起来更像聊天,但它们可以用作调试会话的示例),发现由于 readline 设置的一些问题,即用户特定 @ 987654321@ 配置文件(我会说它可能是一个 readline 错误,因为无论配置是什么,它都不应该出现段错误)。

这显示了我们的软件是多么复杂和脆弱,因为乍一看并不明显,python 可能会因为损坏的库的配置文件而崩溃,甚至没有多少人记得 python 使用过(如果他们甚至记得它存在的话) .

【讨论】:

    【解决方案2】:

    分段错误可能有很多原因。

    例如:

    • 内存不足
    • 内存故障
    • 获取比交换内存更大的海量数据
    • 错误代码
    • 多重递归

    因为您只是想打印一些东西,我会说这可能是原因 1 或 2。

    【讨论】:

    • 我有 16 Gb 的 RAM,一切正常。这绝对是 非硬件 问题,因为 python shell 作为root 或除我的主要用户之外的任何其他用户工作。请阅读我的问题的 cmets,感谢您的回答!
    【解决方案3】:

    我遇到了同样的问题,我通过将 LC_CTYPE 环境变量从 iso 更改为 utf8 来解决它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-11
      • 2018-09-08
      • 2019-08-30
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 2011-02-02
      相关资源
      最近更新 更多