GWAN在负载下终止

  • 本文关键字:终止 负载 GWAN g-wan
  • 更新时间 :
  • 英文 :


我有一个web应用程序,它需要一个restful接口。因此,我有一个连接处理程序,它试图将入站请求更改为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脚本,就不会崩溃。。。

救命!有什么想法吗?

感谢

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,一切都很好!

添加适当的返回值检查,不要认为任何事情都是理所当然的。

这看起来像get_env失败并返回NULL,但有很多事情要做(gdb,strace,..),所以有人可以帮助你。

相关内容

  • 没有找到相关文章

最新更新