如何记录mallocs

问题描述 投票:4回答:11

这有点假设并且经过了简化,但是...

假设一个程序将调用第三方编写的函数。这些政党可以被认为是非敌对的,但不能被认为是“有能力的”。每个函数将带有一些参数,具有副作用并返回一个值。当它们不运行时,它们没有任何状态。

目的是通过记录所有malloc(等)并在函数退出后释放所有内容,以确保它们不会导致内存泄漏。

这可能吗?这可行吗?

ps.s。对我来说,重要的一点是确保没有分配持续存在,因此删除内存泄漏而不采取任何措施的方法对我没有用。

memory memory-management malloc
11个回答
4
投票

您未指定操作系统或环境,此答案假定为Linux,glibc和C。


0
投票

Microsoft Windows提供(可能是当今任何运输OS的最高级堆+(其他已知使用堆的api)基础结构(如果需要POSIX,则使用SUA)。


0
投票

在Linux上,我已成功使用mtrace(3)记录分配和释放。它的用法很简单]


4
投票

首先,您必须提供malloc()free()及其朋友的入口点。因为此代码已经编译过(对吗?),所以您不能依靠#define进行重定向。


3
投票

您可以在单独的过程中运行第三方功能,并在使用库完成后关闭该过程。


2
投票

比尝试记录malloc更好的解决方案可能是在调用它们时对函数进行沙盒处理-使它们可以访问固定的内存段,然后在函数运行完毕后释放该段。


1
投票

您是否可以强迫他们在堆栈上分配所有内存?这样,将保证在函数退出后将其释放。


1
投票

过去,我用C语言编写了一个软件库,它具有一个内存管理子系统,该子系统包含记录分配和释放,以及手动匹配每个分配和释放的功能。这在尝试查找内存泄漏时很有用,但是使用起来很困难且耗时。日志数量不胜枚举,并且花费大量时间来了解日志。


0
投票

由于您担心内存泄漏和谈论malloc / free,所以我假设您使用的是C。根据您的问题,我还假设您无权访问第三方库的源代码。


0
投票

[如果您有足够的钱,请考虑使用Purify跟踪问题。它可以产生奇迹,并且不需要源代码或重新编译。还有其他更便宜的调试malloc库可用。我记得电子围栏是一个名字。也就是说,Denton Gentry提到的调试钩子似乎也很有趣。


0
投票

如果您对Purify太穷了,请尝试Valgrind。它比6年前要好得多,比Purify更容易涉足。

© www.soinside.com 2019 - 2024. All rights reserved.