glibc的MALLOC_CHECK_、M_CHECK_ACTION和mcheck有什么区别?

2024-03-12

glibc 似乎有不止一种方法来进行堆检查:

  1. mallopt 与 M_CHECK_ACTION 参数
  2. MALLOC_CHECK_ 环境变量
  3. mcheck 函数系列

我发现可用的文档令人困惑。这manual http://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html描述 mallopt 时根本没有列出 M_CHECK_ACTION。这个 mallopt 手册页 http://man7.org/linux/man-pages/man3/mallopt.3.html, 然而,does描述M_CHECK_ACTION。此外,它表示它相当于环境变量 MALLOC_CHECK_:

   MALLOC_CHECK_
          This environment variable controls the same parameter as
          mallopt() M_CHECK_ACTION.  If this variable is set to a
          nonzero value, then a special implementation of the memory-
          allocation functions is used.  (This is accomplished using the
          malloc_hook(3) feature.)  This implementation performs
          additional error checking, but is slower than the standard set
          of memory-allocation functions.

glibc 手册有一页mcheck和朋友们 http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html并将它们描述为“堆一致性检查”。手册在此页讨论了 MALLOC_CHECK_:

检查和防止使用 malloc、realloc 和 free 时出现错误的另一种方法是设置环境变量 MALLOC_CHECK_。当设置 MALLOC_CHECK_ 时,将使用一种特殊的(效率较低)实现,该实现旨在容忍简单错误,例如使用相同参数对 free 进行两次调用,或单个字节的溢出(差一错误)。

那么 mcheck 等人是 MALLOC_CHECK_/M_CHECK_ACTION 的替代品吗?

此外,如何禁用所有这些超级有用的一致性检查?手册页说将 MALLOC_CHECK_ (因此 M_CHECK_ACTION)设置为 0 将不会使用“内存分配函数的特殊实现”。然而,glibc 手册指出“当设置 MALLOC_CHECK_ 时,将使用特殊的(效率较低)实现”。设置为 0 的环境变量仍然被设置,因此其中之一是错误的。

我自己的实验(使用示例程序这个 mcheck 手册页 http://man7.org/linux/man-pages/man3/mcheck.3.html)表明根本不设置 MALLOC_CHECK_ 会导致与 MALLOC_CHECK_=3 (在 RHEL 6.4 上)相同的行为。和 mcheck 似乎完全无关,因为它可以独立设置。


有四种不同的一致性检查。以下对应于 glibc 2.25。

  1. 各种断言。它们是否处于活动状态是在 glibc 构建时确定的。过去,Debian 和下游版本保持断言处于打开状态。 Fedora 和下游版本过去禁用了它们(但当前的 Fedora 保留了它们)。
  2. 核心一致性检查malloc不使用断言的实现,但是malloc_printerr。过去,可以使用以下命令关闭它们MALLOC_CHECK_=0 (and mallopt)。但是,我怀疑之后的错误恢复malloc_printerr在所有情况下都是正确的,因此这不太可能起作用。如果存在堆损坏,程序可能很快就会崩溃。
  3. 相对轻量级的堆缓冲区溢出检测。这是通过以下方式启用的MALLOC_CHECK_=3(或另一个非零值)。无法通过以下方式打开此功能mallopt。它是通过增加分配的大小并存储一些填充并在某些地方检查它来实现的。这个堆检查器应该是线程安全的,并且它与malloc内部结构。然而,它很少被使用,因此很容易出现恼人的错误。
  4. The mcheck函数,调用自__malloc_initialize_hook通过链接libmcheck.a。这与之前的检查完全不同。我认为这个想法是通过一组单独的元数据(独立于实际分配器)来验证正确的分配行为,并且mcheck不依赖于glibcmalloc 内部结构除了malloc钩子。然而,它对这些钩子的使用完全不是线程安全的。我认为没有人使用mcheck今天。它只是被包含在内,因为还没有人删除它。 (甚至不需要向后兼容,因为不能保证检测到所有堆损坏,并且损坏堆的应用程序仍然完全未定义,因此无法检测是否mcheck实际上执行额外的检查。)

除此之外,还有MALLOC_PERTURB_,可用于检测对未初始化或已释放数据的某些形式的访问。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

glibc的MALLOC_CHECK_、M_CHECK_ACTION和mcheck有什么区别? 的相关文章

  • 如何在远程计算机上调试 war 文件?

    如果我有一个 jboss 服务器在另一台机器上运行 并且我将我的 war 文件 scp 到该机器 我该如何调试 war 我会使用什么命令 如何在我的终端中执行此操作 在远程计算机上使用调试参数运行 jboss Xdebug Xrunjdwp
  • 在 Chrome 开发者工具中禁用脚本编辑

    我使用 Chrome 开发者工具来调试 JavaScript 代码 但我对 Chrome 允许在 脚本 选项卡下编辑 JavaScript 文件的方式感到不满 有时 我没有意识到我在 Chrome 中 开始对 脚本 选项卡下的代码进行更改
  • Android 中什么原因导致 MotionEvent.ACTION_CANCEL?

    我正在调试 Android 上的一些触摸处理内容 并试图找出为什么 MotionEvent 发送到我的视图onTouchListener包含一个cancel行动 我无法找到任何有关其原因的文档 并且希望有人能为我指出调试此问题的正确方向 错
  • Roslyn 脚本:运行时异常的行号信息

    我正在摆弄 Roslyn 脚本的东西 使用Microsoft CodeAnalysis CSharp Scriptingnuget 包 我想知道是否有一种方法可以将行号信息添加到堆栈跟踪中 以了解脚本内发生的异常 当我运行以下 C 代码时
  • 如何在 gdb 中禁用“键入 继续,或 q 退出”?

    我想要自动化gdb 并且等待用户输入是不可取的 如何禁用消息 Type
  • Eclipse 调试器 - 跳转到或仅显示挂起的线程

    我有一个带有很多线程的 Java 应用程序 在调试时 当一个线程中的执行被断点停止时 在所有线程之间滚动以查找挂起的线程是非常烦人的 有没有办法 按钮 快捷键等 跳转到挂起的线程 或者更好 隐藏所有未挂起的线程 我同意这很烦人 而且答案非常
  • 如何列出运行时函数的所有调用?

    有什么办法可以list 在VS中显示 写入文件 所有来电者 对象 函数 一个函数的当程序运行时 可能使用调试器 我需要record 所有通话 包括来电者 一个函数的从计划启动到终止 简单扫描源代码或二进制文件不做这份工作因为该程序可以作为服
  • 调试Windows服务

    Scenario 我有一个用 C 编写的 Windows 服务 我已经阅读了所有关于如何调试它的谷歌线程 但我仍然无法让它工作 我已经运行 PathTo NetFramework InstallUtil exe C MyService ex
  • 如何禁用 Symfony 2 分析器栏?

    它没有添加任何内容 而且使页面变慢 我希望它消失 别问 网站上几乎没有关于探查器的信息 应用程序配置中也没有任何内容 这个设置是在app config config dev yml web profiler toolbar true int
  • Microsoft Visual Studio 2012 无法在 C# 文件中设置断点

    我安装了 Microsoft Visual Studio Professional 2012 版本 11 0 60610 01 Update 3 调试 C cs 文件时 当我尝试设置断点时 Visual Studio 会显示以下消息 无法在
  • 如何调试没有错误消息的错误?

    如何调试没有错误消息的错误 当加载 PHP 页面时 我在 Firefox 中收到此错误 The connection to the server was reset while the page was loading 除了看起来是 Apa
  • 如何给objc_exception_throw添加断点?

    这是布拉德 拉森对此的回答SO https stackoverflow com questions 1093999 stack trace or more info on unhandled exception in xcode iphon
  • 编写 LESS 时,chrome 调试器中出现红点?

    我正在将 css 文件转换为 LESS 文件 我的 LESS 只有一部分运行良好 我在 chrome 调试器中看到那些有问题的行有一条奇怪的红点线 知道它们是什么意思吗 http codemirror net doc releases ht
  • 如何调试 MySQL 上的锁等待超时?

    在我的生产错误日志中 我偶尔会看到 SQLSTATE HY000 一般错误 1205 超过锁等待超时 尝试 重新开始交易 我知道当时哪个查询正在尝试访问数据库 但是有没有办法找出哪个查询在那个精确时刻拥有锁定 暴露这一点的是这个词交易 从该
  • 如何调试VS2010安装工程?

    如何调试VS2010安装工程 我尝试附加到 msiexec exe 但没 有帮助 我假设您想在安装程序中调试自定义操作 如果是这样 请在运行安装程序时打开解决方案 并将此行代码放在其中一个事件中 System Diagnostics Deb
  • emacs 的最佳 java 工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Chrome 的萤火虫

    谁能推荐一个类似于 Firebug 的不错的 Google Chrome 扩展程序 我确实看到这里有几个类似的问题 但答案似乎非常过时 Thanks It s built in Press Ctrl Shift I Or Tools gt
  • 在 Visual Studio 中调试时向后拖动指令指针

    如需演示 请查看 基本上 我知道这在 Visual Studio Community Edition 2015 中是可能的 我想知道 a 这与 Intellitrace 和 历史调试 有关吗 b 这样做会有副作用吗 或者这只是将指令向后移动
  • 批评我的非侵入式堆调试器

    这是后续批评我的堆调试器 https stackoverflow com questions 2830272 critique my heap debugger从昨天 根据 bitc 的建议 我现在将有关已分配块的元数据保存在单独的手写哈希
  • 如何轻松调试布局 Xml 警告/错误?

    我陷入了这个错误 Warning simplexml load string Entity line 46 parser error Comment not terminated in lib Varien Simplexml Config

随机推荐