除了C示例代码之外,我们还有一个想要分发的C库。
当然,该库是在发布模式中构建的。示例代码项目位于cmake中,因此它可以轻松地在Linux和Windows上运行。在Linux (调试和发行版)和Windows (版本)上,我们没有问题。但是,在Windows (调试)上,离开主程序时有一个问题:程序触发断言:
Invalid address specified to RtlValidateHeap
Expression: _CrtIsValidHeapPointer(block)然后,在继续该过程时,它会引发以下异常:
Unhandled exception at [...] (ntdll.dll)
0xC000000D STATUS_INVALID_PARAMETER由于这似乎与运行时库有关,我们尝试将它从MDd (多线程dll调试)更改为MD (多线程dll) [ https://learn.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=vs-2019 ],并解决了这个问题。然而,这似乎是一项工作,而不是修复:发行版库(用MD构建)应该可以在使用MDd的调试程序中使用,对吗?
据我们了解,运行时库中的冲突仅在调用方进行分配和在被调用方中取消分配时才会出现,反之亦然。因此,我们跟踪所有的拨款,以检查他们,一切似乎都好。我们在Linux (val差制)和Windows (CrtDbg)中对示例代码进行了泄漏检测,但是它们没有发现任何泄漏,一切看起来都很好。
使用MD构建的发布库在MDd程序中运行是正确的吗?如果不是的话,这似乎很奇怪:库总是在发行版中发布,但是在开发时却被用于调试解决方案。如果是的话,是什么引起了这个问题?
发布于 2019-08-12 14:23:29
这听起来更像是堆腐败,而不是泄密。这意味着有人正在覆盖堆(传递其分配的内存)。找到它可能是痛苦的,但是。
首先,检查示例代码。把它降到最低限度的“你好世界”,然后建立起来,直到它再次发生。然后检查示例代码。如果不是示例代码,请检查调用了哪些库函数并对这些函数进行代码检查。
作为一种帮助,您可以使用MS堆检查函数。将它们放置在函数入口和函数退出处,或维护您定期检查的全局版本。以下是一个例子:
#include <crtdbg.h>
void example(void)
{
_CrtMemState memStateStart, memStateEnd, memStateDelta;
// Make a checkpoint of the heap's state so we can later check the heap is still OK
_CrtMemCheckpoint( &memStateStart );
//
// do your things
//
// Check the heap
_CrtMemCheckpoint( &memStateEnd );
_CrtSetReportMode( _CRT_WARN, _CRTDBG_MODE_WNDW );
_CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_WNDW );
_CrtSetReportMode( _CRT_ASSERT, _CRTDBG_MODE_WNDW );
if (_CrtMemDifference( &memStateDelta, &memStateStart, &memStateEnd ))
_CrtMemDumpStatistics( &memStateDelta );
_CrtDumpMemoryLeaks();
}https://stackoverflow.com/questions/57462705
复制相似问题