【发布时间】:2013-06-25 01:29:35
【问题描述】:
我遇到了一个奇怪的现象:在 python 解释器中,我做了以下事情:
>>>import numpy
>>>help(numpy)
帮助显示正确,但当我按 q 返回解释器时:
Segmentation fault (core dumped)
我不知道是什么导致了段错误,如果我使用本地名称(典型的 np)导入 numpy,它仍然会发生。任何其他库都不会发生这种情况。我尝试卸载并重新安装 numpy 但这没有任何区别。 numpy 是否太大而无法以这种方式处理,或者我的解释器有问题?我该如何解决这个问题?
我正在运行 Ubuntu 13.04 32 位并使用 Python 2.7.4。
更新: PYTHONSTARTUP 和 PYTHONPATH 都是空的。 编写一个执行此操作的脚本具有完全相同的效果。
此外,numpy 和其他库也可以完美运行,只是在 numpy 上使用时会出现混乱的帮助调用。
更新 2:
对于 test.py:
if __name__ == "__main__":
import numpy
help(numpy)
这是 gdb 输出:
$ gdb --args python test.py
GNU gdb (GDB) 7.5.91.20130417-cvs-ubuntu
Copyright (C) 2013 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 "i686-linux-gnu".
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>...
Reading symbols from /usr/bin/python2.7...(no debugging symbols found)...done.
(gdb) run
Starting program: /usr/bin/python2.7 test.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/i386-linux-gnu/libthread_db.so.1".
Program received signal SIGPIPE, Broken pipe.
0xb7fdd424 in __kernel_vsyscall ()
(gdb) where
#0 0xb7fdd424 in __kernel_vsyscall ()
#1 0xb7eb2cf3 in write () from /lib/i386-linux-gnu/libc.so.6
#2 0xb7e447e1 in _IO_file_write () from /lib/i386-linux-gnu/libc.so.6
#3 0xb7e446c6 in ?? () from /lib/i386-linux-gnu/libc.so.6
#4 0xb7e45422 in _IO_file_xsputn () from /lib/i386-linux-gnu/libc.so.6
#5 0xb7e3a025 in fwrite () from /lib/i386-linux-gnu/libc.so.6
#6 0x080ac05b in ?? ()
#7 0x080b6bde in PyEval_EvalFrameEx ()
#8 0x080b71c0 in PyEval_EvalFrameEx ()
#9 0x0811f939 in PyEval_EvalCodeEx ()
#10 0x080b80d4 in PyEval_EvalFrameEx ()
#11 0x080b71c0 in PyEval_EvalFrameEx ()
#12 0x0811f939 in PyEval_EvalCodeEx ()
#13 0x080b7265 in PyEval_EvalFrameEx ()
#14 0x080b71c0 in PyEval_EvalFrameEx ()
#15 0x0811f939 in PyEval_EvalCodeEx ()
#16 0x081203ee in ?? ()
#17 0x080e11f9 in ?? ()
#18 0x080e3daf in PyObject_Call ()
#19 0x08129483 in ?? ()
#20 0x080b8a3e in PyEval_EvalFrameEx ()
#21 0x0811f939 in PyEval_EvalCodeEx ()
#22 0x0812029e in ?? ()
---Type <return> to continue, or q <return> to quit---
#23 0x080e11f9 in ?? ()
#24 0x080e3daf in PyObject_Call ()
#25 0x0816dd88 in ?? ()
#26 0x080b7615 in PyEval_EvalFrameEx ()
#27 0x0811f939 in PyEval_EvalCodeEx ()
#28 0x081836c7 in PyEval_EvalCode ()
#29 0x08183b7d in ?? ()
#30 0x080a6032 in PyRun_FileExFlags ()
#31 0x080a65f8 in PyRun_SimpleFileExFlags ()
#32 0x080a74af in Py_Main ()
#33 0x080a7581 in main ()
(gdb)
更新 3:
$strace -f python test.py 的输出很长,下面是它克隆子进程的最后几行:
[pid 2610] clone(Process 2611 attached child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD, child_tidptr=0xb7527968) = 2611
[pid 2610] wait4(-1, Process 2610 suspended
<unfinished ...>
[pid 2611] execve("/usr/bin/less", ["less"], [/* 53 vars */]) = 0
[pid 2611] brk(0) = 0x89ed000
[pid 2611] access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
[pid 2611] mmap2(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7734000
[pid 2611] access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
[pid 2611] open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
[pid 2611] fstat64(3, {st_mode=S_IFREG|0644, st_size=93821, ...}) = 0
[pid 2611] mmap2(NULL, 93821, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb771d000
[pid 2611] close(3) = 0
[pid 2611] access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
[pid 2611] open("/lib/i386-linux-gnu/libtinfo.so.5", O_RDONLY|O_CLOEXEC) = 3
[pid 2611] read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\320W\0\0004\0\0\0"..., 512) = 512
[pid 2611] fstat64(3, {st_mode=S_IFREG|0644, st_size=121032, ...}) = 0
[pid 2611] mmap2(NULL, 124748, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb76fe000
[pid 2611] mmap2(0xb771a000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1b) = 0xb771a000
[pid 2611] close(3) = 0
[pid 2611] access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
[pid 2611] open("/lib/i386-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
[pid 2611] read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\220\232\1\0004\0\0\0"..., 512) = 512
[pid 2611] fstat64(3, {st_mode=S_IFREG|0755, st_size=1770984, ...}) = 0
[pid 2611] mmap2(NULL, 1780508, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb754b000
[pid 2611] mmap2(0xb76f8000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x1ad) = 0xb76f8000
[pid 2611] mmap2(0xb76fb000, 11036, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb76fb000
[pid 2611] close(3) = 0
[pid 2611] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb754a000
[pid 2611] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7549000
[pid 2611] set_thread_area({entry_number:-1 -> 6, base_addr:0xb75496c0, limit:1048575, seg_32bit:1, contents:0, read_exec_only:0, limit_in_pages:1, seg_not_present:0, useable:1}) = 0
[pid 2611] mprotect(0xb76f8000, 8192, PROT_READ) = 0
[pid 2611] mprotect(0xb771a000, 8192, PROT_READ) = 0
[pid 2611] mprotect(0x8069000, 4096, PROT_READ) = 0
[pid 2611] mprotect(0xb7757000, 4096, PROT_READ) = 0
[pid 2611] munmap(0xb771d000, 93821) = 0
[pid 2611] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] brk(0) = 0x89ed000
[pid 2611] brk(0x8a0e000) = 0x8a0e000
[pid 2611] stat64("/home/marzul/.terminfo", 0xbfac7780) = -1 ENOENT (No such file or directory)
[pid 2611] stat64("/etc/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 2611] access("/etc/terminfo/x/xterm", R_OK) = -1 ENOENT (No such file or directory)
[pid 2611] stat64("/lib/terminfo", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
[pid 2611] access("/lib/terminfo/x/xterm", R_OK) = 0
[pid 2611] open("/lib/terminfo/x/xterm", O_RDONLY|O_LARGEFILE) = 3
[pid 2611] fstat64(3, {st_mode=S_IFREG|0644, st_size=3315, ...}) = 0
[pid 2611] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7733000
[pid 2611] read(3, "\32\1)\0&\0\17\0\235\1Z\5xterm|xterm-debian|X"..., 4096) = 3315
[pid 2611] read(3, "", 4096) = 0
[pid 2611] close(3) = 0
[pid 2611] munmap(0xb7733000, 4096) = 0
[pid 2611] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] ioctl(1, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] ioctl(1, TIOCGWINSZ, {ws_row=24, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
[pid 2611] ioctl(2, TIOCGWINSZ, {ws_row=24, ws_col=80, ws_xpixel=0, ws_ypixel=0}) = 0
[pid 2611] open("/usr/bin/.sysless", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
[pid 2611] open("/etc/sysless", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
[pid 2611] open("/home/marzul/.less", O_RDONLY|O_LARGEFILE) = -1 ENOENT (No such file or directory)
[pid 2611] open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
[pid 2611] fstat64(3, {st_mode=S_IFREG|0644, st_size=8748544, ...}) = 0
[pid 2611] mmap2(NULL, 2097152, PROT_READ, MAP_PRIVATE, 3, 0) = 0xb7349000
[pid 2611] mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x5e1) = 0xb7733000
[pid 2611] close(3) = 0
[pid 2611] open("/usr/lib/locale/locale-archive", O_RDONLY|O_LARGEFILE|O_CLOEXEC) = 3
[pid 2611] fstat64(3, {st_mode=S_IFREG|0644, st_size=8748544, ...}) = 0
[pid 2611] mmap2(NULL, 4096, PROT_READ, MAP_PRIVATE, 3, 0x5d8) = 0xb7732000
[pid 2611] close(3) = 0
[pid 2611] open("/home/marzul/.lesshst", O_RDONLY|O_LARGEFILE) = 3
[pid 2611] fstat64(3, {st_mode=S_IFREG|0600, st_size=129, ...}) = 0
[pid 2611] mmap2(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xb7731000
[pid 2611] read(3, ".less-history-file:\n.search\n\"pus"..., 4096) = 129
[pid 2611] read(3, "", 4096) = 0
[pid 2611] close(3) = 0
[pid 2611] munmap(0xb7731000, 4096) = 0
[pid 2611] open("/dev/tty", O_RDONLY|O_LARGEFILE) = 3
[pid 2611] ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] fsync(3) = -1 EINVAL (Invalid argument)
[pid 2611] ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] ioctl(3, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig -icanon -echo ...}) = 0
[pid 2611] ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
[pid 2611] rt_sigaction(SIGINT, {0x805cc00, [INT], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
[pid 2611] rt_sigaction(SIGTSTP, {0x805cb80, [TSTP], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
[pid 2611] rt_sigaction(SIGWINCH, {0x805cbc0, [WINCH], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
[pid 2611] rt_sigaction(SIGQUIT, {SIG_IGN, [QUIT], SA_RESTART}, {SIG_DFL, [], 0}, 8) = 0
[pid 2611] ioctl(0, SNDCTL_TMR_TIMEBASE or TCGETS, 0xbfac9088) = -1 ENOTTY (Inappropriate ioctl for device)
[pid 2611] stat64("-", 0xbfac90a0) = -1 ENOENT (No such file or directory)
[pid 2611] write(1, "\33[?1049h\33[?1h\33=\r", 16) = 19
[pid 2611] fsync(3) = -1 EINVAL (Invalid argument)
[pid 2611] ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig -icanon -echo ...}) = 0
[pid 2611] ioctl(3, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] ioctl(3, SNDCTL_TMR_TIMEBASE or TCGETS, {B38400 opost isig icanon echo ...}) = 0
[pid 2611] exit_group(0) = ?
Process 2610 resumed
Process 2611 detached
[pid 2610] <... wait4 resumed> [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 2611
[pid 2610] --- SIGCHLD (Child exited) @ 0 (0) ---
[pid 2610] sigreturn() = ? (mask now [])
[pid 2610] exit_group(0) = ?
Process 2610 detached
<... write resumed> ) = 73728
--- SIGPIPE (Broken pipe) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) ---
write(4, "l the attributes of the ndarray "..., 3043328) = -1 EPIPE (Broken pipe)
--- SIGPIPE (Broken pipe) @ 0 (0) ---
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV (core dumped) +++
Segmentation fault (core dumped)
更新 4:
$echo $LESS
$cat cat ~/.less
cat: /home/user/.less: No such file or directory
显然less根本没有配置。
在终端中搜索未从 strace 中截断的“= 4”得到以下片段:
read(3, "---------\n a, b : ndarray\n\n "..., 4096) = 4096
read(3, "epstr = \", \"\n arglist = argum"..., 4096) = 4096
read(3, "* Total of %d references found. "..., 4096) = 4096
read(3, "`output` not supplied then sourc"..., 4096) = 4096
read(3, " r += sum([200 for w in wha"..., 4096) = 4096
read(3, " except NameErr"..., 4096) = 4096
read(3, " return tuple([self.vis"..., 4096) = 4018
和
[pid 3294] write(2, "Missing filename (\"less --help\" "..., 42) = 42
更新 5:
$strace -f python test.py 2>&1 | tee -a out.txt ; (exit ${PIPESTATUS})
$cat out.txt | grep "open(.*) = 4"
open("/usr/lib/python2.7/site.pyc", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/os.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/traceback.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/sysconfig.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/re.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/_sysconfigdata.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/local/lib/python2.7/dist-packages/easy-install.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/PILcompat.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/gtk-2.0-pysupport-compat.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/pygtk.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/python-support.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/setuptools.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/ubuntu-sso-client.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/ubuntuone-client.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/ubuntuone-control-panel.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/ubuntuone-storage-protocol.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/wx.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/zope.interface-4.0.5-nspkg.pth", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/sitecustomize.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/encodings/__init__.pyc", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/codecs.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/encodings/aliases.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/encodings/utf_8.pyc", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/__init__.pyc", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/__config__.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/version.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/_import_tools.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/add_newdocs.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/fft/__init__.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/polynomial/__init__.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/random/__init__.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/ctypeslib.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/dist-packages/numpy/ma/__init__.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/inspect.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/pkgutil.py", O_RDONLY|O_LARGEFILE) = 4
open("/usr/lib/python2.7/repr.py", O_RDONLY|O_LARGEFILE) = 4
更新 6:
没有open(...)我也发现了:
ERR_PRINT = 4
FPE_UNDERFLOW = 4
【问题讨论】:
-
FWIW,我无法在 python 2.7.3 和 Ubuntu 10.04(老派)和 numpy 1.6.2 上重现
-
既然您有一个要复制的脚本,请执行以下操作:
gdb --args python yourScriptNameHere。说“运行”来启动程序,等待它崩溃,然后说“哪里”看看在哪里。然后为我们发布堆栈跟踪。 -
好的,下一步:运行
strace -f python yourScriptName。在它死之前看看最终的函数调用是什么。您应该在接近末尾的堆栈跟踪中看到fwrite()。向我们展示它所说的内容,其中将包括文件描述符以及正在写入的字节的第一部分。如果您想查看更多写入的字节,我认为 strace 也有一个选项。通过这种方式,我们可以发现它是否在写入 stdout、stderr 或其他内容时崩溃了,也许还有关于它正在尝试写入的内容。 -
echo $LESS或cat ~/.less是否向您展示了什么?我很好奇你的“少”配置是否奇怪。另外,您能否再次运行 strace 并在整个内容中搜索 `= 4` 以查找文件描述符 4 是什么?这是在整个事情崩溃之前被写入的那个。很可能是生成的“less”的标准输入。 -
@JohnZwinck FWIW,我可以在香草 Ubuntu 13.04 64 位上重现这个。文件描述符 4 是通过调用
pipe2(2):pipe2([3, 4], O_CLOEXEC) = 0创建的,这可能是python和less之间的管道。对write(4, ...)的调用发生在less进程终止后,因此SIGPIPE。
标签: python ubuntu python-2.7 numpy segmentation-fault