gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 17:56:50 25 4
gpt4 key购买 nike

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

经过一番调试后,偶然发现我的/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\

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

以下是失败时 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) ---

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

    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

什么信息可以帮助我将责任归咎于/tmp 的挂载选项?

最佳答案

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

关于python - 当使用 noexec 挂载/tmp 时,为什么在 Python 中出现段错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28355169/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com