【问题标题】:trac-admin with svn post-commit hook causes segmentation fault带有 svn 提交后挂钩的 trac-admin 导致分段错误
【发布时间】:2011-04-06 13:45:59
【问题描述】:

我刚刚在我的 Fedora 机器上通过 sqlite 设置了 trac 0.12.2,并且 trac 通过 Web 浏览器和命令行运行良好。我的问题是实现 svn 钩子,其中 post-commit 钩子在运行此命令时因分段错误而死:

/usr/bin/trac-admin /var/trac/myproject changeset added "$1" "$2"

其中 $1 是本地文件系统上的 svn 存储库路径,$2 是修订版。

这个命令的输出是这样的:

/path/to/svn/hooks/post-commit: line 9: 3874 Segmentation fault /usr/bin/trac-admin /var/trac/myproject changeset added "$1" "$2"

我将如何进行调试?有谁知道为什么在全新安装时会发生这种情况(我没有升级,它很干净)?

我对运行此命令的用户(apache)进行了一些基本检查。我还尝试以apache 运行此命令以查看它是否会失败,但这只能从命令行中找到:

sudo -u apache /usr/bin/trac-admin /var/trac/ujaweb changeset added /path/to/svn/repo 750

我在这里有点想不通。有谁知道为什么会发生这种情况?

如果有用,这里有一些进一步的信息:

Linux:Linux hostname.com 2.6.18-028stab069.5 #1 SMP 5 月 18 日星期二 17:26:16 MSD 2010 x86_64 x86_64 x86_64 GNU/Linux
阿帕奇:2.2.17 w/ mod_wsgi
Python:2.6.4
Trac:0.12.2(通过带有 mod_wsgi 的 Apache)

【问题讨论】:

标签: linux svn trac svn-hooks


【解决方案1】:

您可以尝试在strace 下运行trac-admin,并保存输出:

/usr/bin/strace -o /var/trac/myproject/log/trace.log /usr/bin/trac-admin /var/trac/myproject changeset added "$1" "$2"

然后,查看/var/trac/myproject/log/trace.log中生成的日志。

另一种选择是让您的系统生成核心转储(您可能必须在您的/etc/limits 和/或/etc/security/limits.conf 中启用它),然后使用gdb 打开转储。

【讨论】:

  • 感谢您的建议。我不清楚,但是可能导致故障的原因。我对它进行了 tgzip 压缩,它可以在这里找到:205.186.157.63/strace.tgz -- 现在,在打开 open("/proc/mounts", O_RDONLY) 后,看起来 munmap(0x2b4850bb7000, 4096) 失败了。我不确定这意味着什么。有什么想法吗?
  • 它不会在 munmap() 处失败,而是在之后。我在跟踪中看到两个嫌疑人:对 /selinux 的引用和 vzfs 文件系统。此外,在最后几行中,尝试在 /tmp、/var/tmp 和 /dev/shm 中创建临时文件时出现 EPERM 和 EACCESS 错误。您可能需要检查您的安全策略和权限,并确保您可以创建临时文件。
  • 哦,我的错。在 /tmp 和 /var/tmp 中创建文件成功,使用 EPERM 失败的是 mmap()。 mmap() 手册页对此有以下说法:“prot 参数要求 PROT_EXEC,但映射区域属于文件系统上的文件,该文件以非执行方式挂载。”所以你应该使用“exec”选项挂载/tmp。
  • ... 或找出创建临时文件的原因并使用 PROT_EXEC 请求 mmap() 处理它们。它可能与 ctypes 有关,请参阅bugs.python.org/issue5504
  • 感谢您的建议。我正在尝试重新挂载 tmp,但我得到“挂载:权限被拒绝”(是的,我正在以 root 身份运行),所以这有点令人沮丧。现在我也想弄清楚这一点......
【解决方案2】:

我的第一次尝试是关闭 selinux 一段时间并测试它是否仍然发生。 如果不是 - 您必须弄清楚如何配置 selinux 以允许该进程打开 /proc/mount 并因分段错误而失败。

【讨论】:

  • SElinux 似乎没有运行。 /usr/sbin/getenforce 文件不存在,/etc/sysconfig 中没有配置,root 下的/selinux 目录为空。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-09
  • 1970-01-01
  • 2011-03-19
  • 2011-10-11
  • 2010-11-09
  • 2012-10-18
  • 2014-09-07
相关资源
最近更新 更多