基于Poco HTTPTimeServer的服务器多次请求后崩溃问题排查
问题根源及解决办法
你的问题核心是**log_指针未正确初始化,或是悬空指针**,和多线程锁无关:
无效的日志对象导致崩溃
Poco的poco_information宏必须依赖一个有效的Logger实例才能正常工作。如果log_是未初始化的野指针,或者它指向的Logger对象已经被销毁,第一次请求可能碰巧没触发崩溃,但第二次请求时内存状态变化就会直接导致程序崩溃。你加的互斥锁只处理了日志输出的线程安全,根本没解决log_本身无效的问题。手动加锁完全多余
Poco的Logger类本身已经实现了线程安全,不需要你额外用std::mutex来保护日志操作。这个锁不仅没用,反而可能带来不必要的性能损耗。具体修复步骤
- 先在
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
相关产品推荐
相关产品推荐

