【发布时间】:2011-05-24 00:21:59
【问题描述】:
嗨,我想知道是否有任何现成的函数可以调用来打印所有 malloc 数据结构,以便我可以看到为哪个变量分配了哪些内存?
我有这种内存损坏,当我释放一个变量时它会抱怨,但我不知道哪个变量与它相邻。
谢谢!
【问题讨论】:
标签: linux memory malloc memory-corruption
嗨,我想知道是否有任何现成的函数可以调用来打印所有 malloc 数据结构,以便我可以看到为哪个变量分配了哪些内存?
我有这种内存损坏,当我释放一个变量时它会抱怨,但我不知道哪个变量与它相邻。
谢谢!
【问题讨论】:
标签: linux memory malloc memory-corruption
尝试在valgrind 下运行您的程序。如果你幸运的话,它会指出你正确的越界内存写入。 (如果你不走运,你只会收到大量关于 C 库深处代码的虚假抱怨。)
【讨论】:
我认为这很难弄清楚你描述它的方式,因为内存中没有任何东西指向拥有的变量。
理论上,您可以遍历应用程序创建的所有对象的整个树,直到找到一个指针,该指针指向导致问题的位置旁边的内存。
您可以使用gdb 之类的工具来转储分配的内存块并自己查看。也许您会通过查看数据来识别数据,从而将您指向导致问题的代码。
最好的办法是使用像电子围栏这样的工具,当你的代码试图破坏内存时,它会立即杀死你的应用程序。
【讨论】:
我不知道您可以在程序中调用任何函数,但您可以使用调试器来执行此操作。尝试https://github.com/cloudburst/libheap 或在windbg 中的Win32 下使用'!heap' 命令。
【讨论】:
我们的CheckPointer 工具可能会找到您损坏内存的确切位置。
大多数内存检查工具都在您的数据周围设置了某种“栅栏”,以检测错误访问。这种栅栏的粒度比被栅栏的对象大得多;如果您在对象外部但在栅栏内部访问,则不会检测到错误。例如,Valgrind 对堆栈帧一无所知,因此它无法检测到对超出范围并被另一个堆栈帧覆盖的堆栈帧的访问。 CheckPointer 可以。
CheckPointer 跟踪每个存储块(堆、堆栈、结构的一部分)和每次访问的确切分配。它确切地知道您何时超出了为存储实体预留的确切空间(例如,如果您超出了嵌入在结构中间的数组的末端)。因此,它可以提供更好的检查。
CheckPointer 还将提供所有仍然分配的存储的执行后转储;当然,您可以在代码中的任意位置调用该转储过程作为调试辅助。
【讨论】: