使用 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<16,0>+57 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 255)</avrf:trace>
<avrf:trace>my_exe!std::allocator<int>::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<int,std::allocator<int> >::_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<int,std::allocator<int> >::~vector<int,std::allocator<int> >+2b (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\vector @ 588)</avrf:trace>
<avrf:trace>my_exe!std::vector<int,std::allocator<int> >::`scalar deleting destructor'+23 ( @ 0)</avrf:trace>
<avrf:trace>my_exe!std::_Default_allocator_traits<std::allocator<std::vector<int,std::allocator<int> > > >::destroy<std::vector<int,std::allocator<int> > >+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<std::allocator<std::vector<int,std::allocator<int> > > >+68 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 937)</avrf:trace>
<avrf:trace>my_exe!std::vector<std::vector<int,std::allocator<int> >,std::allocator<std::vector<int,std::allocator<int> > > >::_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<std::vector<int,std::allocator<int> >,std::allocator<std::vector<int,std::allocator<int> > > >::~vector<std::vector<int,std::allocator<int> >,std::allocator<std::vector<int,std::allocator<int> > > >+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 给出了正确的指示。
我找不到如何在 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<16,0>+57 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 255)</avrf:trace>
<avrf:trace>my_exe!std::allocator<int>::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<int,std::allocator<int> >::_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<int,std::allocator<int> >::~vector<int,std::allocator<int> >+2b (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\vector @ 588)</avrf:trace>
<avrf:trace>my_exe!std::vector<int,std::allocator<int> >::`scalar deleting destructor'+23 ( @ 0)</avrf:trace>
<avrf:trace>my_exe!std::_Default_allocator_traits<std::allocator<std::vector<int,std::allocator<int> > > >::destroy<std::vector<int,std::allocator<int> > >+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<std::allocator<std::vector<int,std::allocator<int> > > >+68 (C:\Program Files\Microsoft Visual Studio22\Community\VC\Tools\MSVC.30.30705\include\xmemory @ 937)</avrf:trace>
<avrf:trace>my_exe!std::vector<std::vector<int,std::allocator<int> >,std::allocator<std::vector<int,std::allocator<int> > > >::_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<std::vector<int,std::allocator<int> >,std::allocator<std::vector<int,std::allocator<int> > > >::~vector<std::vector<int,std::allocator<int> >,std::allocator<std::vector<int,std::allocator<int> > > >+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 给出了正确的指示。