我越来越
*** glibc检测到***(/ my / program / …):malloc():内存损坏:0xf28000fa ***
我已经在valgrind下运行,它报告已经被释放的内存的情况,但没有非法内存写入的情况 。
可以读取释放内存导致内存损坏? 如果不是的话,还有什么build议可以在valgrind之外的地方看看?
您可以使用GDB来监视这个内存地址中的每个写入,如下所示:
(gdb) watch *((int*)0xf28000fa)
然后你可以调试问题出在哪里。
阅读不会造成记忆腐败,但有很多情况下,你甚至不会想到这可能是造成这种情况的原因,Valgrind不是一个完美的工具。
查看更多关于调试内存问题的信息 。
它不会破坏你读的内存,但是对你的程序的运行不会有奇迹。
读取释放的内存也被认为是内存损坏。
不,阅读无效位置不可能导致您所看到的错误。 如果该地址在您的地址空间中有效,那么您只会阅读垃圾邮件,如果不是,则会出现分段错误。
检查valgrind的输出以查看无效的读取来自哪里 – 这会给你提示真正的错误所在。 一旦你发现这个,我很确定真正的罪魁祸首不会太远,这可能是一个无效的写。
在当前的处理器上不应该那么普遍,但是我已经在平台上工作,即使是读操作也可以做到这一点。 在具体的6502处理器已经映射了I / O,所以一个具有I / O映射地址的常规“读”指令可以做出令人惊讶的事情。
大约30年前,我被这个问题困扰了,因为我的坏的读取引发了一个存储库切换(即存储器的每个字节,包括代码的区域,在该指令之后得到一个新的不同的值)。 有趣的是,这不是一个真正的“无意的”坏阅读…即使知道这将是垃圾,我实际上做了阅读,因为这节省了我几个汇编指令…不是一个聪明的举动。
真正可以发生的事情是,可以使用madvise(MADV_DONTNEED)系统调用来告诉内核“我不需要这个页面,放下它”(参见madvise(2)手册页)。 如果这个页面真的被释放,并且你从里面读取任何内容,内核会默默地提供一个新的页面,归零 – 从而导致你的应用程序遇到完全意想不到的数据!