Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么在使用noexec挂载/tmp时,Python中会出现分段错误?_Python_Debugging_Gdb_Segmentation Fault_Strace - Fatal编程技术网

为什么在使用noexec挂载/tmp时,Python中会出现分段错误?

为什么在使用noexec挂载/tmp时,Python中会出现分段错误?,python,debugging,gdb,segmentation-fault,strace,Python,Debugging,Gdb,Segmentation Fault,Strace,我正在Linux的CherryPy上运行一个定制的Python 2.7.3应用程序。当我使用/etc/init.d/中的服务脚本启动或停止服务时,我遇到了一个分段错误(SIGSEGV)。奇怪的是,如果我使用“python/path/to/file.py--stop”从shell手动运行start或stop命令,我就不会收到SIGSEGV。服务脚本执行相同的命令 经过一些调试之后,我偶然发现my/tmp上安装了一个“noexec”选项。我删除了“noexec”选项,应用程序能够通过服务脚本启动和停

我正在Linux的CherryPy上运行一个定制的Python 2.7.3应用程序。当我使用/etc/init.d/中的服务脚本启动或停止服务时,我遇到了一个分段错误(SIGSEGV)。奇怪的是,如果我使用“python/path/to/file.py--stop”从shell手动运行start或stop命令,我就不会收到SIGSEGV。服务脚本执行相同的命令

经过一些调试之后,我偶然发现my/tmp上安装了一个“noexec”选项。我删除了“noexec”选项,应用程序能够通过服务脚本启动和停止,没有任何分段错误

当我第一次遇到这个问题时,我运行了strace并生成了一个内核转储。这两种工具都没有给我任何迹象表明/tmp是罪魁祸首。我的问题是:我如何使用strace或gdb来帮助我识别/tmp上的“noexec”导致了分段错误

以下是分析核心转储时gdb的一些输出:

(gdb) bt full #0 PyObject_Malloc (nbytes=4) at Objects/obmalloc.c:788 bp = 0x7f6b0fd1c6e800 \Address 0x7f6b0fd1c6e800 out of bounds\ pool = 0x7f6b0fd1c000 next = \value optimized out\ size = 0 #1 0x00007f6b0f7fd8e6 in _PyUnicode_New (length=1) at Objects/unicodeobject.c:345 new_size = 4 unicode = 0x3873480 #2 0x00007f6b0f7fdd4e in PyUnicodeUCS2_FromUnicode (u=0x38367cc, size=) at Objects/unicodeobject.c:461 unicode = \value optimized out\ (gdb)英国电信全部 #在Objects/obmalloc.c:788处0 PyObject_Malloc(n字节=4) bp=0x7f6b0fd1c6e800\地址0x7f6b0fd1c6e800超出范围\ 池=0x7f6b0fd1c000 下一步=\value优化输出\ 大小=0 #1 0x00007f6b0f7fd8e6,在Objects/unicode对象处使用新的(长度=1)格式。c:345 新尺寸=4 unicode=0x3873480 #2 0x00007f6b0f7fdd4e,采用PyUnicode格式2_(u=0x38367cc,大小=) at Objects/unicodeobject.c:461 unicode=\value优化输出\ (输出量大得多,这只是前几行)

以下是strace关于故障的一些输出:

3046 open("/usr/local/python2.7/lib/python2.7/site-packages/oauthlib/common.py", O_RDONLY) = 9 3046 fstat(9, {st_mode=S_IFREG|0644, st_size=13310, ...}) = 0 3046 open("/usr/local/python2.7/lib/python2.7/site-packages/oauthlib/common.pyc", O_RDONLY) = 10 3046 fstat(10, {st_mode=S_IFREG|0644, st_size=16043, ...}) = 0 3046 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7fbc9ff9d000 3046 read(10, "\3\363\r\n}\321\322Tc\0\0\0\0\0\0\0\0\5\0\0\0@@\2\0sd\2\0\0d\0"..., 4096) = 4096 3046 fstat(10, {st_mode=S_IFREG|0644, st_size=16043, ...}) = 0 3046 read(10, "\0\0\0C@\2\0s\330\0\0\0t\0\0|\0\0t\1\0\203\2\0s\36\0t\0\0|\0"..., 8192) = 8192 3046 read(10, "thon2.7/site-packages/oauthlib/c"..., 4096) = 3755 3046 read(10, "", 4096) = 0 3046 close(10) = 0 3046 munmap(0x7fbc9ff9d000, 4096) = 0 3046 --- SIGSEGV (Segmentation fault) @ 0 (0) --- 3046 open(“/usr/local/python2.7/lib/python2.7/site packages/oauthlib/common.py”,O_RDONLY)=9 3046 fstat(9,{st_mode=S_IFREG | 0644,st_size=13310,…})=0 3046 open(“/usr/local/python2.7/lib/python2.7/site packages/oauthlib/common.pyc”,O_RDONLY)=10 3046 fstat(10,{st_mode=S_IFREG | 0644,st_size=16043,…})=0 3046 mmap(空,4096,保护读取|保护写入,映射私有|映射匿名,-1,0)=0x7fbc9ff9d000 3046读(10,“\3\363\r\n}\321\322Tc\0\0\0\0\0\0\5\0\0\0\0@@@2\0sd\2\0\0d\0”…,4096)=4096 3046 fstat(10,{st_mode=S_IFREG | 0644,st_size=16043,…})=0 3046读(10,“\0\0\0C@\2\0s\330\0\0\0\0t\0\0t\1\0\203\2\0s\36\0t\0\0\0”…,8192)=8192 3046读(10,“thon2.7/站点包/oauthlib/c”…,4096)=3755 3046读(10,“,4096)=0 3046关闭(10)=0 3046 munmap(0x7fbc9ff9d0004096)=0 3046---SIGSEGV(分段故障)@0(0)--- 解决问题后,这里是strace的一个代码片段,与它尝试加载oauthlib/common.pyc的位置相同-请注意,唯一的区别似乎是munmap()之前的一个brk():

3416开放(“/usr/local/python2.7/lib/python2.7/site packages/oauthlib/common.pyc”,O_RDONLY)=10 3416 fstat(10,{st_mode=S_IFREG | 0644,st_size=16043,…})=0 3416 mmap(空,4096,保护读取|保护写入,映射私有|映射匿名,-1,0)=0x7f5791f2c000 3416读(10,“\3\363\r\n}\321\322Tc\0\0\0\0\0\0\5\0\0\0\0@@@2\0sd\2\0\0d\0”…,4096)=4096 3416 fstat(10,{st_mode=S_IFREG | 0644,st_size=16043,…})=0 3416读(10,“\0\0\0C@\2\0s\330\0\0\0\0t\0\0t\1\0\203\2\0s\36\0t\0\0\0”…,8192)=8192 3416读(10,“thon2.7/站点包/oauthlib/c”…,4096)=3755 3416读(10,“,4096)=0 3416 brk(0x372f000)=0x372f000 3416关闭(10)=0 3416 munmap(0x7f5791f2c000,4096)=0 3416关闭(9)=0
哪些信息可以帮助我指出/tmp的挂载选项的错误?

对于那些与我有相同问题的人,请参阅本页: 我的CherryPy server.py在python3.8上的Win10系统上运行良好,但在使用python3.6.1的Linux系统上由于分段错误而失败。
在Linux上切换到python3.8解决了我的问题。

strace diff可能没有用;相反,获取python的调试版本(在ubuntu上很容易,但必须是系统范围的,而不是virtualenv),并尝试找出为指针分配的无效空间。另外,cmd行和init.d/cron.d之间的区别在于环境变量——启动脚本中的log
env
,您应该能够从cmd行模拟执行。例如,
$TMP$PATH$LD\u LIBRARY\u PATH
可能不同。相反,我们提到了
/var/tmp
。。也请追踪它并打开python上游的bug。您的应用程序是纯python还是调用用C编写的代码?@MarkPlotnick-它是纯python。我相信Python解释器有时会调用C代码 3416 open("/usr/local/python2.7/lib/python2.7/site-packages/oauthlib/common.pyc", O_RDONLY) = 10 3416 fstat(10, {st_mode=S_IFREG|0644, st_size=16043, ...}) = 0 3416 mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5791f2c000 3416 read(10, "\3\363\r\n}\321\322Tc\0\0\0\0\0\0\0\0\5\0\0\0@@\2\0sd\2\0\0d\0"..., 4096) = 4096 3416 fstat(10, {st_mode=S_IFREG|0644, st_size=16043, ...}) = 0 3416 read(10, "\0\0\0C@\2\0s\330\0\0\0t\0\0|\0\0t\1\0\203\2\0s\36\0t\0\0|\0"..., 8192) = 8192 3416 read(10, "thon2.7/site-packages/oauthlib/c"..., 4096) = 3755 3416 read(10, "", 4096) = 0 3416 brk(0x372f000) = 0x372f000 3416 close(10) = 0 3416 munmap(0x7f5791f2c000, 4096) = 0 3416 close(9) = 0