首页 > 解决方案 > 假定 Windows C++ 代码中的堆损坏,而在 Linux 中运行良好(_CrtlsValidHeapPointer(block)) - libcurl

问题描述

我已经在 Linux(使用 libcurl)中进行了所有应用程序的开发,并决定在 Windows 64 位中构建它。一切顺利 - 它编译没有问题,等等......但是当我运行它时,我在调用 libcurl 的curl_easy_perform(). 进一步来说:

Debug assertion failed! Expression: _CrtlsValidHeapPointer(block).

我很困惑我回到 Linux 上运行 valgrind,并且没有损坏的堆块。回到 Windows,我尝试剥离所有应用程序代码,运行标准 CURL 教程代码:

CURL* req = curl_easy_init();
CURLcode res;  
if (req)
{
    curl_easy_setopt(req, CURLOPT_URL, "www.google.com");
    curl_easy_setopt(req, CURLOPT_FOLLOWLOCATION, 1L);
    printf("Passed this point\n");
    res = curl_easy_perform(req);   
    if (res != CURLE_OK)
    {
        fprintf(stderr, "curl_easy_operation() failed : %s\n", curl_easy_strerror(res));
    }
}  

curl_easy_cleanup(req);

瞧,它仍然因同样的错误而崩溃!

我对出了什么问题的唯一想法是构建配置中可能有问题?虽然我现在完全不知道它可能是什么......

我得到了这个项目的一个较旧的工作提交,并在该代码库中运行了与上面完全相同的 libcurl 代码并且没有崩溃......

在比较 MSVC 用于编译先前版本和当前版本的“命令行”命令时,它们似乎与我完全相同(相同的切换、.libs 和所有)。

有没有人知道在这种情况下可能导致崩溃的原因是什么?

编辑:堆栈跟踪:

ntdll.dll!00007ffa809c9df2()    Unknown
ntdll.dll!00007ffa8098e03a()    Unknown
ntdll.dll!00007ffa80934365()    Unknown
KernelBase.dll!00007ffa7e3dc99b()   Unknown
ucrtbased.dll!00007ffa394c37d1()    Unknown
ucrtbased.dll!00007ffa394c1b85()    Unknown
ucrtbased.dll!00007ffa394c51c5()    Unknown
ucrtbased.dll!00007ffa394c58c8()    Unknown
vkPhysics_server.exe!Curl_setstropt()   C
vkPhysics_server.exe!Curl_vsetopt() C
vkPhysics_server.exe!curl_easy_setopt() C

更新:我尝试从以前的提交中调整一个较旧的 CMake 文件,并且崩溃停止了。我将尝试研究可能导致 CRT 崩溃的两者之间的区别(对于那些感兴趣的人,这里是diff

标签: c++windowscurlwinapimemory-corruption

解决方案


推荐阅读