【问题标题】:lighttpd: Enable core dump of cgi binarylighttpd:启用 cgi 二进制文件的核心转储
【发布时间】:2019-01-05 21:23:33
【问题描述】:

我一直在 ubuntu 上使用带有 cgi 的 lighttpd。我遇到了一个我想调试的“500 - 内部服务器错误”案例。

当我的二进制文件崩溃时,有没有办法让 lighttpd/cgi 转储内核? 我遇到了this page,它有一个启用核心转储的字段,但在 lighthtpd.conf 中包含server.core-files="enable" 似乎不起作用。

有什么想法吗?

谢谢。

附: 以下是我用来生成内核的测试程序:

int main()
{
    char* html = "<html>\n"\
                 "<header>" \
                 "<title>This is title</title></header>\n" \
                 "<body>\n"\
                 "Hello world\n"\
                 "</body>\n"\
                 "</html>";
    html[1] = 'r';
    std::cout<<html;
    return 0;
}

我通过执行“ulimit -c unlimited”将限制设置为无限制。当我从命令行运行二进制文件时,我可以在当前目录中看到一个核心。但是从浏览器调用时,cgi-bin 中没有核心。 Cgi 日志有以下条目:

2018-07-29 17:20:41: (server.c.1558) 服务器由 UID = 0 PID = 1 停止

2018-07-29 17:21:18: (log.c.164) 服务器启动

2018-07-29 21:29:16: (mod_cgi.c.601) cgi 死了,pid: 28197

2018-07-29 21:29:17: (mod_cgi.c.601) cgi 死了,pid: 28202

【问题讨论】:

  • 是什么让您如此确定您的 cgi 二进制文件会崩溃?日志是怎么说的?
  • 我写了一个崩溃的测试程序。当我通过命令行运行时,我在当前目录中看到一个核心,但从浏览器调用时,cgi-bin 中没有核心。
  • @Swordfish 已更新。
  • 这不是有效的 C++。字符串字面量是const char *,查看这个:stackoverflow.com/questions/6949150/…

标签: c++ ubuntu cgi fastcgi lighttpd


【解决方案1】:

您无需要求 lighttpd 在崩溃时生成核心转储。你需要问内核。检查sysctl -a | grep kernel.core_pattern 核心文件是如何/在哪里/是否在您的系统上写入的,并在需要时进行更改。

【讨论】:

  • 实际上是“核心”(kernel.core_pattern = core)。我在 cgi-bin 中找不到核心,但是当我从命令行运行二进制文件时,我可以在当前目录中看到。
【解决方案2】:

长话短说,这就是标准对字符串文字的描述:

不以 u、U 或 L 开头的字符串文字是普通的 字符串文字,也称为窄字符串文字。一个 普通字符串文字的类型为“n const char 数组”,其中 n 是 字符串的大小定义如下;它有静态存储 持续时间 (3.7) 并使用给定的字符进行初始化。

所以你在这里做的有点等价:

const char tmp_html[] = "<html>\n"\
             "<header>" \
             "<title>This is title</title></header>\n" \
             "<body>\n"\
             "Hello world\n"\
             "</body>\n"\
             "</html>";
char *html = const_cast<char *>(tmp_html);
html[1] = 'r';

考虑到你正在抛出 const 并且它很可能会导致将文字放入不可写的内存中,因此程序崩溃也就不足为奇了。最简单的解决方案是使用 C++ 而不是过时的 C 解决方案:

int main()
{
    std::string html = "<html>\n"\
                 "<header>" \
                 "<title>This is title</title></header>\n" \
                 "<body>\n"\
                 "Hello world\n"\
                 "</body>\n"\
                 "</html>";
    html[1] = 'r';
    std::cout<<html;
    return 0;
}

【讨论】:

    【解决方案3】:

    在将以下更改应用于 Ubuntu 18.04 后,我得到了由 lighttpd 调用的 cgi 的核心转储。

    ulimit -c                                # 0=disabled
    ulimit -c unlimited                      # enable core dumping
    cat /proc/sys/fs/suid_dumpable           # 0=disabled, 1=???, 2=???
    sysctl -w fs.suid_dumpable=2             # to enable dumping of setuid root process
    cat /proc/sys/kernel/core_pattern        # to check how core dump is handled
    echo core>/proc/sys/kernel/core_pattern  # to stop apport intercepting dump
    

    对于 lighttpd,将以下设置添加到 lighttpd.conf 并重新启动 lig​​httpd

    server.core-files = "enable"
    

    ulimit 更改仅适用于当前 shell。要使其永久更改 /etc/security/limits.conf 并重新启动 lig​​httpd。

    【讨论】:

      猜你喜欢
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-05
      相关资源
      最近更新 更多