curl_slist_free_all()导致GKE w / Debian 8.7上的段错误
我已经为libcurl封装了我在Google Container Engine上部署的C ++守护进程。 除了一个小问题之外,一切都很精彩。 无论何时调用curl_slist_free_all()
它都会发生段curl_slist_free_all()
。 它不会在Ubuntu 14或16或MacOS上发生。 它只发生在Debian 8.7的GKE Docker环境中。 这实际上是我唯一的错误,几周来一直困扰着我。
我已经用RAII风格的容器包装资源句柄,以保证exception安全(是的,是的,我使用例外)和泄漏保护。 easy_init和easy_cleanup在CurlSession的构造函数和析构函数中。 global_init&cleanup在HTTP构造函数和析构函数中。
我validation了没有两个免费的情况,spelunked libcurl代码,仍然无法理解为什么这只发生在这个操作系统环境。 我设法附加一个debugging器,并将其隔离到单个slist清除调用。
唯一可以让我的代码工作的方法是在其他所有的env中泄漏,这不是一个交易的破坏者,而是我的记忆分析器给了我一个干净的健康法案。
任何见解或共享的痛苦感激。
我的标题slist包装:
HTTP::Headers::Headers() : slist{nullptr} {} HTTP::Headers::Headers(const HeaderKeyValues &headers) : slist{nullptr} { for (const auto& header : headers) add(header.first, header.second); } HTTP::Headers::~Headers() { curl_slist_free_all(slist); // <- seems to crash on Google's Debian image slist = nullptr; }; void HTTP::Headers::add(const std::string& key, const std::string& value) { std::ostringstream os; os << key << ": " << value; slist = curl_slist_append(slist, os.str().c_str()); if (!slist) { LOG(fatal) << "Failed appending to header list"; throw std::runtime_error{"Failed appending to header list"}; } }
调度员的子集:
HTTP::Response HTTP::dispatch(const Request& req) const { CurlSession session; const auto handle = session.handle; Headers headerList{req.headers}; if (req.chunked) headerList.add("Transfer-Encoding", "chunked"); // more ... // if (headerList.notEmpty()) curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headerList.slist); // perform the actual request CURLcode result = curl_easy_perform(handle);
我怀疑这是Docker构build镜像与仅在GKE上运行的Docker部署映像之间的某种微妙的不兼容性。
- 如何在AspNetCore网站Docker-Container中使用Docker命令?
- 无法使用Go客户端从Docker访问stdout
- 使用wkhtmltopdf,ASP.NET Core中的docker将HTML转换为PDF
- Docker可以帮助构build在不同平台上工作的可执行文件
- 是否有任何有效的方式获得docker左侧的物理内存?
- 用docker-compose运行docker镜像
- 基于环境的连接string与ASP NET CORE和Docker支持
- 使用RestSharp获取“使用Shipyard API时,阻止操作被调用WSACancelBlockingCall”中断
- 如何使用Docker容器来设置ASP.NET Web应用程序