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

问题描述 投票:1回答:1

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

经过一些调试后,偶然地,我发现/ tmp是用“ noexec”选项挂载的。我删除了“ noexec”选项,该应用程序能够通过服务脚本启动和停止,而没有任何分段错误。

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

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

(gdb)bt已满#0 PyObject_Malloc(nbytes = 4)at Objects / obmalloc.c:788bp = 0x7f6b0fd1c6e800 \地址0x7f6b0fd1c6e800 \池= 0x7f6b0fd1c000下一个= \值优化输出\大小= 0#1 0x00007f6b0f7fd8e6 in _PyUnicode_New(length = 1)at Objects / unicodeobject.c:345new_size = 4统一码= 0x3873480#2 0x00007f6b0f7fdd4e in PyUnicodeUCS2_FromUnicode(u = 0x38367cc,size =)在Objects / unicodeobject.c:461unicode = \值优化输出\

(有很多输出,这只是前几行)

这是失败时strace的一些输出:

3046打开(“ /usr/local/python2.7/lib/python2.7/site-packages/oauthlib/common.py”,O_RDONLY)= 93046 fstat(9,{st_mode = S_IFREG | 0644,st_size = 13310,...})= 03046 open(“ / usr / local / python2.7 / lib / python2.7 / site-packages / oauthlib / common.pyc”,O_RDONLY)= 103046 fstat(10,{st_mode = S_IFREG | 0644,st_size = 16043,...})= 03046 mmap(NULL,4096,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0)= 0x7fbc9ff9d0003046读取(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)= 40963046 fstat(10,{st_mode = S_IFREG | 0644,st_size = 16043,...})= 03046读取(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)= 81923046读取(10,“ thon2.7 / site-packages / oauthlib / c” ...,4096)= 37553046读取(10,“”,4096)= 03046关闭(10)= 03046 munmap(0x7fbc9ff9d000,4096)= 03046-SIGSEGV(分段故障)@ 0(0)-

解决问题后,这是strace的片段,从它试图加载oauthlib / common.pyc的同一点开始-注意,唯一的区别似乎是munmap()之前的brk():

3416 open(“ / usr / local / python2.7 / lib / python2.7 / site-packages / oauthlib / common.pyc”,O_RDONLY)= 103416 fstat(10,{st_mode = S_IFREG | 0644,st_size = 16043,...})= 03416 mmap(NULL,4096,PROT_READ | PROT_WRITE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0)= 0x7f5791f2c0003416读取(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)= 40963416 fstat(10,{st_mode = S_IFREG | 0644,st_size = 16043,...})= 03416读取(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)= 81923416读取(10,“ thon2.7 / site-packages / oauthlib / c” ...,4096)= 37553416读取(10,“”,4096)= 03416 brk(0x372f000)= 0x372f0003416关闭(10)= 03416 munmap(0x7f5791f2c000,4096)= 03416关闭(9)= 0

哪些信息可以帮助我归咎于/ tmp的安装选项?

python debugging gdb segmentation-fault strace
1个回答
0
投票

对于那些会遇到与我相同的问题并找到此页面的人:我的CherryPy server.py在python3.8的Win10系统上运行良好,但由于具有python3.6.1的Linux系统上的分段错误而失败。在Linux上切换到python3.8解决了我的问题。

© www.soinside.com 2019 - 2024. All rights reserved.