问题描述
访调员 - 如果您没有工具可以检查如何检测内存泄漏问题?
答案 - 我将阅读代码,看看我分配的所有内存是否已被代码本身释放.
访调员不满意.还有其他方法吗?
推荐答案
对于下面定义的所有实现,需要为malloc()&free()函数编写包装器.
-
要保持简单,请跟踪Malloc()&Free()的计数.如果不相等,则您有内存泄漏.
-
一个更好的版本是跟踪地址malloc()'ed&free()'ed以这种方式确定哪些地址为malloc()'ed and ed not free()'ed.但这再次,也不会有太大帮助,因为您无法将地址与源代码联系起来,尤其是当您拥有大型源代码时,这将成为一个挑战.
-
因此,您可以在这里添加更多功能.例如,我为FreeBSD内核编写了类似的工具,您可以修改malloc()调用以存储模块/文件信息(给每个模块/文件一个no,您可以在某些标题中#define),<函数调用的C3>导致此malloc()并将其存储在数据结构中,每当调用malloc()或free()时,将其存储在数据结构中.使用malloc()返回的地址与free()匹配.因此,当他们的内存泄漏时,您就有有关哪些地址不是free()'ed的信息,在哪个文件中,(通过stack trace)将确切的函数(通过stack trace)固定为钉子.
<
的方式,此工具的工作是在崩溃中,我曾经得到一个核心降低.我在内核内存空间中定义了全球(我正在收集数据的数据结构),我可以使用gdb访问并检索信息.
.编辑:
最近,当调试Linux内核中的模因泄漏时,我遇到了这个称为kmemleak的工具,该工具在上面的第3点中描述了我所描述的类似算法.在此处阅读Basic Algorithm部分:文档/kmemleak.txt
其他推荐答案
我必须为真实做到这一点时,我的响应是 build 工具...一个调试堆层,包裹在c堆上,宏和宏切换代码以与这些代码相反呼叫而不是直接访问普通堆库.该层包含一些围栏逻辑以检测数组范围,一些仪器以监视堆在做什么,可选地确切地记录了谁分配和释放了每个块...
当然,另一种方法是"分裂和征服".构建单元测试以尝试缩小哪些操作导致泄漏,然后进一步细分该代码.
根据"无工具"的含义,核心转储有时也很有用.看到堆的内容可能会告诉您正在泄漏的内容.
等等....