首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C运行时库发布MD/MDd

C运行时库发布MD/MDd
EN

Stack Overflow用户
提问于 2019-08-12 14:02:23
回答 1查看 158关注 0票数 1

除了C示例代码之外,我们还有一个想要分发的C库。

当然,该库是在发布模式中构建的。示例代码项目位于cmake中,因此它可以轻松地在Linux和Windows上运行。在Linux (调试和发行版)和Windows (版本)上,我们没有问题。但是,在Windows (调试)上,离开主程序时有一个问题:程序触发断言:

代码语言:javascript
复制
Invalid address specified to RtlValidateHeap
Expression: _CrtIsValidHeapPointer(block)

然后,在继续该过程时,它会引发以下异常:

代码语言:javascript
复制
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程序中运行是正确的吗?如果不是的话,这似乎很奇怪:库总是在发行版中发布,但是在开发时却被用于调试解决方案。如果是的话,是什么引起了这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-12 14:23:29

这听起来更像是堆腐败,而不是泄密。这意味着有人正在覆盖堆(传递其分配的内存)。找到它可能是痛苦的,但是。

首先,检查示例代码。把它降到最低限度的“你好世界”,然后建立起来,直到它再次发生。然后检查示例代码。如果不是示例代码,请检查调用了哪些库函数并对这些函数进行代码检查。

作为一种帮助,您可以使用MS堆检查函数。将它们放置在函数入口和函数退出处,或维护您定期检查的全局版本。以下是一个例子:

代码语言:javascript
复制
#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();
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57462705

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档