如何知道分配给定内存块的内容? [关闭]

Posted

技术标签:

【中文标题】如何知道分配给定内存块的内容? [关闭]【英文标题】:How to know what allocated a given chunk of memory? [closed] 【发布时间】:2014-11-09 00:46:32 【问题描述】:

我想知道,给定任何内存块,例如类的实例或std::vector,我可以推断出哪个函数(可能来自 *alloc 函数族)分配给定的一块内存甚至更好,调用newallocator(如果使用)在我的应用程序中创建了可寻址空间。

【问题讨论】:

开箱即用是不可能的。您可以创建自己的自定义分配方案来跟踪它。 您几乎必须编写分配器,以便它分配一些额外的空间,并在该内存中记录数据以识别分配器(例如,分配器的地址)。 @JerryCoffin 并不是说​​如果没有一些额外的信息,仅仅一个地址会有什么好处。 @ddriver “开箱即用”是什么意思?像gdb 这样的东西难道不能做到这一点吗?还是 valgrind 进行一些逆向工程? How to determine if returned pointer is on the stack or heap的可能重复 【参考方案1】:

C/C++ 内存分配器不跟踪这条数据——它只跟踪每个分配区域的大小。没有办法知道是谁分配的。

如果您想要一个更有建设性的答案,您需要告诉我们您想要达到的目标。如果目标是调试您的代码,那么您应该使用第三方内存调试器——valgrind 可能是目前最好的。

【讨论】:

valgrind 存在 1 个大问题,这基本上就是为什么我现在不再使用它了,因为我已经为几乎所有我可以预先调试的东西提供了消毒剂; valgrind 所做的所有事情,都是因为逆向工程,而不是因为它依赖于某些特定的 ABI/文件格式,如 DWARF 提供准确和精确的调试信息。【参考方案2】:

有一些分析工具,例如strace,它可以显示被调用的函数。

【讨论】:

这相当于“有根据的猜测”,在多线程或并发访问的世界中,它只会是一团糟。

以上是关于如何知道分配给定内存块的内容? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

编译器如何在编译时不知道大小的情况下分配内存?

如何查看给定 .NET 应用程序中的内存分配?

如何查看给定 .NET 应用程序中的内存分配?

将多个内存块呈现为单个连续块的容器

带指针的内存管理

pd虚拟机中如何手动分配内存?