You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Poco HTTPTimeServer的服务器多次请求后崩溃问题排查

问题根源及解决办法

你的问题核心是**log_指针未正确初始化,或是悬空指针**,和多线程锁无关:

  1. 无效的日志对象导致崩溃
    Poco的poco_information宏必须依赖一个有效的Logger实例才能正常工作。如果log_是未初始化的野指针,或者它指向的Logger对象已经被销毁,第一次请求可能碰巧没触发崩溃,但第二次请求时内存状态变化就会直接导致程序崩溃。你加的互斥锁只处理了日志输出的线程安全,根本没解决log_本身无效的问题。

  2. 手动加锁完全多余
    Poco的Logger类本身已经实现了线程安全,不需要你额外用std::mutex来保护日志操作。这个锁不仅没用,反而可能带来不必要的性能损耗。

  3. 具体修复步骤

    • 先在WifiRequestHandler的构造函数里正确初始化log_,获取有效的Logger实例:
      WifiRequestHandler::WifiRequestHandler() {
          log_ = &Poco::Logger::get("WifiRequestHandler"); // 获取全局Logger对象
      }
      
    • 移除那套手动加锁的代码,直接用Poco的日志宏就行:
      void WifiRequestHandler::handleRequest(Poco::Net::HTTPServerRequest& request, Poco::Net::HTTPServerResponse& response) {
        std::string uri = request.getURI();
        std::string method = request.getMethod();
      
        poco_information(*log_, "处理请求: " + method + " " + uri);
        
        if (uri == "/" && method == "GET") { // 注意你代码里写的frag_应该是uri的笔误吧?
          response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_OK);
          response.sendBuffer(nullptr, 0);
        } else { 
          response.setStatusAndReason(Poco::Net::HTTPResponse::HTTP_NOT_FOUND);
          response.sendBuffer(nullptr, 0);
        }
      }
      
    • 顺便检查下frag_变量:你前面获取了请求的uri,但判断时用的是frag_,这大概率是笔误,应该改成用uri来匹配请求路径。

内容的提问来源于stack exchange,提问作者Stephen Burke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 17:42:12