lighttpd:启用cgi二进制文件的核心转储

时间:2018-07-29 12:10:57

标签: c++ ubuntu cgi fastcgi lighttpd

我一直在Ubuntu上将lighttpd与cgi一起使用。我遇到了要调试的“ 500-内部服务器错误”案例。

有什么方法可以让我的二进制崩溃时让lighttpd / cgi转储内核吗? 我碰到了this page,它有一个用于启用核心转储的字段,但是在lighhtpd.conf中包含server.core-files="enable"似乎无效。

有什么主意吗?

谢谢。

P.S。 以下是我用于生成内核的测试程序:

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

长话短说,这就是标准关于字符串文字的内容:

  

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

所以您在这里所做的工作是等效的:

<?xml version="1.0" encoding="utf-8"?>
<resources>
     <string name="Address">Address</string>
     <string name="AppName">App</string>
</resources>

考虑到您正在抛出const,并且事实很可能是constness导致将文字放入不可写的内存中,这也难怪程序会崩溃。最简单的解决方案是使用C ++而不是古老的C解决方案:

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';

答案 2 :(得分:0)

在对Ubuntu 18.04进行以下更改后,我得到了lighttpd调用的cgi的核心转储。

server.core-files = "enable"

对于lighttpd,请在lighttpd.conf中添加以下设置,然后重新启动lighttpd

ST_Distance_Sphere

ulimit更改仅适用于当前shell。要使其永久更改,请在/etc/security/limits.conf中重新启动lighttpd。