我一直在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
答案 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。