我的网络应用需要是一个安静的界面。所以我有一个连接处理程序,试图将入站请求更改为gwan可以使用的东西。
此服务的每个连接都是相同的,所以我在每个连接上进行替换:
#include "gwan.h" // G-WAN exported functions
#include <stdio.h>
int init(int argc, char *argv[]){
u32 *states = (u32*)get_env(argv, US_HANDLER_STATES);
*states = 1 << HDL_AFTER_READ; // we assume "GET /hello" sent in one shot
return 0;
}
void clean(int argc, char *argv[]){}
int main(int argc, char *argv[])
{
const long state = (long)argv[0];
if(state == HDL_AFTER_READ) {
xbuf_t *read_xbuf = (xbuf_t*)get_env(argv, READ_XBUF);
xbuf_replfrto(read_xbuf, read_xbuf->ptr, read_xbuf->ptr + 16, "/classify.htm?", "/?boost.cpp&");
}
return 255;
}
问题是,在负载下,一段时间后,G-WAN崩溃并给我一个错误:
G-WAN 4.3.14 (pid:20477)
terminate called after throwing an instance of 'std::logic_error'
what(): basic_string::_S_construct NULL not valid
Signal : 6:Abort
Signal src : -6:tkill
errno : 0
Thread : 2
Code Pointer: 7fc5dcd748a5 (module:libc.so.6, function:raise, line:0)
Access Address: 000000004ffd
Registers : EAX=000000000000 CS=00000033 EIP=7fc5dcd748a5 EFLGS=000000000202
EBX=0000006693e8 SS=0000000a ESP=7fc5d5c7bf38 EBP=7fc5880008d8
ECX=ffffffffffffffff DS=0000000a ESI=00000000504e FS=00000033
EDX=000000000006 ES=0000000a EDI=000000004ffd CS=00000033
Module :Function :Line # PgrmCntr(EIP) RetAddress FramePtr(EBP)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Aborted (core dumped)
问题出在我将服务器置于负载之下时。使用一台机器,我每秒可以达到8000个请求,并且在崩溃之前持续大约5秒钟。
如果我不进行重写(将main.c移动到main.c_)并直接调用cpp脚本,则不会崩溃......
帮助!有什么想法吗?
由于
答案 0 :(得分:1)
IT处于代码的不同部分......最大的线索是它看起来像我得到了一个C ++未处理的异常。
根据文件,G-Wan是用C语言写的。
挖掘我的代码,并在我怀疑代码崩溃的地方添加了一些异常处理,我看到异常,但服务器继续运行,这就是我想要的!
我修复它的片段:
try {
get_arg("key=",&name,argc,argv);
string url = name;
boost::thread cls(classify_url,url,boost::ref(rp));
if(!cls.timed_join(boost::posix_time::milliseconds(8))) {
cls.interrupt();
rp="{\"c\": [998]}";
}
}
catch(...) {
rp="{\"c\": [997]}";
cout << "EXCEPTION" << endl;
}
添加了try / catch,一切都很好!
答案 1 :(得分:0)
添加正确的返回值检查,不要采取任何授予的方式。
这看起来像get_env
失败并返回NULL
,但是你有很多东西(gdb,strace,..)所以有人可以帮助你。