【问题标题】:Segmentation fault while initiating a C program through PHP通过 PHP 启动 C 程序时出现分段错误
【发布时间】:2012-01-13 13:18:39
【问题描述】:

操作系统:ubuntu 11.10 网络服务器:阿帕奇 代码:PHP

您好,我正在尝试通过 PHP 网页“执行”C 代码。当我直接在终端上运行相同的 C 代码时,它工作正常,但是当我通过 PHP “执行”它时,我得到一个分段错误。

知道为什么会有这种行为吗?我的 C 代码在几个地方做小的“malloc”。代码在使用 ./a.out 直接通过终端执行时也能正常工作

当 PHP 尝试执行 C 代码时,我有办法 gdb 吗?

谢谢

【问题讨论】:

  • 您可以将 gdb 附加到正在运行的进程,但如果它运行得很快就很难了。更好的解决方案是确保当程序崩溃时,它会生成一个核心转储,gdb 可以使用该转储来帮助调试。
  • @Joachim 如果您在附加调试器之前遇到程序死机的问题,并且相对简单,只需创建一个显式设置为 1 的局部标志变量,然后放入类似 while (var) sleep( 1);自旋环。附加调试器后,您可以将变量设置为 0,程序将继续运行。

标签: php c apache gdb segmentation-fault


【解决方案1】:

很可能是用户权限错误。您的 Web 服务器将作为不同的用户(nobody、wwwrun 或类似用户)运行。尝试对 Web 服务器用户执行 su,并以该用户身份运行 C 程序。

【讨论】:

  • 以超级用户身份运行 Web 服务器可能不是一个好主意,至少如果它不仅仅是为了测试。只是想补充一点,这不是永久的解决方案。
  • 这也不是我的建议! su 到 web 服务器用户,这样你就可以看到程序是如何作为该用户运行的。
【解决方案2】:

如果没有实际看到代码,很难说。你确定你的程序没有泄漏吗?您是否能够添加一些调试控制台输出以查看崩溃的时间/位置?您的程序是否尝试访问任何资源(如文件、端口等)? Web 服务器的用户(或运行 php 脚本的人)是否有足够的权限来实际正确执行它?

【讨论】:

  • 是的,我正在尝试在我的 C 代码中打开一个文件。关于如何允许 Web 服务器用户打开文件等的任何指针?
  • 失败可能有多种原因。 Web 服务器(或者更具体的 php 解释器)可能会使用绝对或相对路径从另一个目录调用您的可执行文件。例如。您的可执行文件可能位于/home/,但它将从/usr/bin/(或任何地方)运行。此外,关于用户权限,如果您的 Web 服务器在同一组中,请将文件 chmod 为 550。如果它也在不同的组中,请将其设置为 555(数据文件,而不是程序;程序应该是 770 或第777章)。
  • 另外,作为一项附加的安全措施:不要将可执行文件(以及可能的数据)放在可从 Web 访问的路径中,以避免有人直接执行或打开文件。
  • 感谢您的见解。问题在于我的 C 代码中的相对路径。一旦我指定了输入文件的完整路径,它就可以工作了。感谢您的见解!
  • @user940154 这表明您没有正确检查返回值。如果您调用的函数可以返回某种错误(例如 fopen 返回 NULL),那么请务必检查它并在出现错误时做一些明智的事情。
【解决方案3】:

您可以做的是启用核心转储文件创建并在 exe 崩溃后将核心转储读取到 gdb。要启用核心转储创建,请查看“ulimit”的作用。

顺便说一句:程序崩溃的一个可能原因是未初始化的变量,尤其是指针变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 2015-03-20
    • 2013-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多