gpt4 book ai didi

c++ - curl_slist_free_all() 在带有 Debian 8.7 的 GKE 上导致段错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:43:28 25 4
gpt4 key购买 nike

我已经为部署在 Google Container Engine 上的 C++ 守护进程包装了 libcurl。除了一个小问题外,一切都很好。每当我调用 curl_slist_free_all() 时,它就会出现段错误。它不会发生在 Ubuntu 14s 或 16s 或 macOS 上。它只发生在带有 Debian 8.7 的 GKE Docker 环境中。这实际上是我唯一的错误,它已经困扰了我数周。

我已经用 RAII 样式的容器包装了资源句柄,以实现异常安全(是的,是的......我使用异常)和泄漏保护。 easy_init 和 easy_cleanup 位于 CurlSession 的构造函数和析构函数中。 global_init 和清理在 HTTP 构造函数和析构函数中。

我验证了不存在双重释放情况,深入研究了 libcurl 代码,但仍然无法理解为什么这种情况只发生在这个操作系统环境中。我设法附加了一个调试器并将其隔离到单个 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 构建镜像和 Docker 部署镜像之间的某种微妙的不兼容,只有在 GKE 上运行时才会出现。

关于c++ - curl_slist_free_all() 在带有 Debian 8.7 的 GKE 上导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44339435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com