使用 CPLEX 在 C++ 中进行堆损坏跟踪

heap corruption tracing in C++ with CPLEX

我找不到如何在 C++ 中跟踪堆损坏错误的根本原因的解决方案。

我用 C++ 编写了 CPLEX 模型,到目前为止一切正常。我曾经测试过一些新实例,但现在突然遇到堆损坏错误。 应用程序验证器返回给我:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<avrf:logfile xmlns:avrf="Application Verifier">
    <avrf:logSession TimeStarted="2022-01-27 : 14:40:09" PID="7876" Version="2">
        <avrf:logEntry Time="2022-01-27 : 14:40:27" LayerName="Heaps" StopCode="0xF" Severity="Error">
            <avrf:message>Corrupted suffix pattern for heap block.</avrf:message>
            <avrf:parameter1>1f684551000 - Heap handle used in the call.</avrf:parameter1>
            <avrf:parameter2>1f6871a7fe0 - Heap block involved in the operation.</avrf:parameter2>
            <avrf:parameter3>18 - Size of the heap block.</avrf:parameter3>
            <avrf:parameter4>1f6871a7ff8 - Corruption address.</avrf:parameter4>
            <avrf:stackTrace>
                <avrf:trace>vrfcore!VerifierDisableVerifier+7a7 ( @ 0)</avrf:trace>
                <avrf:trace>verifier!VerifierStopMessage+b9 ( @ 0)</avrf:trace>
                <avrf:trace>verifier!VerifierDisableFaultInjectionExclusionRange+3693 ( @ 0)</avrf:trace>
                <avrf:trace>verifier!VerifierDisableFaultInjectionExclusionRange+39a4 ( @ 0)</avrf:trace>
                <avrf:trace>verifier!VerifierDisableFaultInjectionExclusionRange+b02 ( @ 0)</avrf:trace>
                <avrf:trace>verifier!VerifierDisableFaultInjectionExclusionRange+c3f ( @ 0)</avrf:trace>
                <avrf:trace>verifier!VerifierDisableFaultInjectionExclusionRange+27ad ( @ 0)</avrf:trace>
                <avrf:trace>ntdll!RtlRegisterSecureMemoryCacheCallback+1744 ( @ 0)</avrf:trace>
                <avrf:trace>ntdll!RtlGetCurrentServiceSessionId+1471 ( @ 0)</avrf:trace>
                <avrf:trace>ntdll!RtlGetCurrentServiceSessionId+1324 ( @ 0)</avrf:trace>
                <avrf:trace>ntdll!RtlFreeHeap+51 ( @ 0)</avrf:trace>
                <avrf:trace>vrfcore!VerifierSetAPIClassName+1fc ( @ 0)</avrf:trace>
                <avrf:trace>ucrtbase!free_base+1b ( @ 0)</avrf:trace>
                <avrf:trace>my_exe!std::_Deallocate&lt;16,0&gt;+57 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 255)</avrf:trace>
                <avrf:trace>my_exe!std::allocator&lt;int&gt;::deallocate+43 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 823)</avrf:trace>
                <avrf:trace>my_exe!std::vector&lt;int,std::allocator&lt;int&gt; &gt;::_Tidy+b2 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\vector @ 1635)</avrf:trace>
                <avrf:trace>my_exe!std::vector&lt;int,std::allocator&lt;int&gt; &gt;::~vector&lt;int,std::allocator&lt;int&gt; &gt;+2b (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\vector @ 588)</avrf:trace>
                <avrf:trace>my_exe!std::vector&lt;int,std::allocator&lt;int&gt; &gt;::`scalar deleting destructor&apos;+23 ( @ 0)</avrf:trace>
                <avrf:trace>my_exe!std::_Default_allocator_traits&lt;std::allocator&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt; &gt; &gt;::destroy&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt; &gt;+32 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 692)</avrf:trace>
                <avrf:trace>my_exe!std::_Destroy_range&lt;std::allocator&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt; &gt; &gt;+68 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 937)</avrf:trace>
                <avrf:trace>my_exe!std::vector&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt;,std::allocator&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt; &gt; &gt;::_Tidy+87 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\vector @ 1633)</avrf:trace>
                <avrf:trace>my_exe!std::vector&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt;,std::allocator&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt; &gt; &gt;::~vector&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt;,std::allocator&lt;std::vector&lt;int,std::allocator&lt;int&gt; &gt; &gt; &gt;+2b (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\vector @ 588)</avrf:trace>
                <avrf:trace>my_exe!Model::~Model+124 ( @ 0)</avrf:trace>
                <avrf:trace>my_exe!Simulation::Simulation+fbd (C:\Users\un_po\source\repos\my_exe\my_exe\Simulation.cpp @ 240)</avrf:trace>
                <avrf:trace>my_exe!main+5c1 (C:\Users\un_po\source\repos\my_exe\my_exe\run.cpp @ 188)</avrf:trace>
                <avrf:trace>my_exe!__scrt_common_main_seh+10c (d:\a01\_work\s\src\vctools\crt\vcstartup\src\startup\exe_common.inl @ 288)</avrf:trace>
                <avrf:trace>KERNEL32!BaseThreadInitThunk+14 ( @ 0)</avrf:trace>
                <avrf:trace>ntdll!RtlUserThreadStart+21 ( @ 0)</avrf:trace>
            </avrf:stackTrace>
        </avrf:logEntry>
    </avrf:logSession>
</avrf:logfile>

我在某处看到我可以使用地址来查找错误,但不幸的是我迷路了。我还在 gflag 中启用了页面堆。我尝试 运行 我在 WinDBG 中的程序,但是代码没有使用命令行参数执行...

有什么建议可以从这里继续吗?

如果您可以访问 Linux 框,也许您可​​以尝试使用 valgrind (https://valgrind.org/) 来诊断您的问题?

所以我调试了好几个小时的代码,最后通过分配一个向量长度之外的值,发现了向量的缓冲区溢出。我不太明白为什么我没有收到任何错误消息,但我很高兴一切都结束了。一些有用的 post.

感谢@TimChippingtonDerrick 给出了正确的指示。