我正在研究多线程C应用程序。最近,我们观察到一些内存损坏(非常罕见)。为了确定我们已经通过-lmcheck链接进行了测试。但是在我们知道-lmcheck不是线程安全的之后。然后,我们从MALLOC_CHECK = 3开始测试。在这里我有一个尚未解决的疑问,即-lmcheck和MALLOC_CHECK = 3行为是否相同? MALLOC_CHECK = 3线程安全与否?如果有人回答过,这对我很有帮助..我尝试使用valgrind,电围栏,但没有用。

最佳答案

根据有关堆一致性检查的GNU文章,mcheck被定义为MT-不安全。


  函数:int mcheck(无效(* abortfn)(枚举mcheck_status状态))
  
  初步: MT不安全种族:mcheck const:malloc_hooks |不安全
  腐败AC不安全损坏
  
  不安全地调用MT不安全,AS不安全,AC不安全功能
  上述安全上下文。在这种情况下称呼他们
  调用未定义的行为。


那么,使用MALLOC_CHECK_与链接“ -lmcheck”有什么区别?


  MALLOC_CHECK_就“ -lmcheck”而言是独立的。
  已添加“ -lmcheck”以实现向后兼容性。都
  MALLOC_CHECK_和“ -lmcheck”应发现相同的错误-但使用
  MALLOC_CHECK_,您无需重新编译应用程序。


设置MALLOC_CHECK_:


  如果MALLOC_CHECK_设置为0(零),则内存管理功能
  仅容忍错误,不发出警告。也许是
  如果我们被其他人阻止找到一个内存错误,则很有用
  目前不方便修复;它可能允许我们使用其他
  追查其他内存错误的工具。如果您
  正在运行可在另一个系统上运行但不在Linux上运行的代码。它
  可以提供一种快速的解决方法,它可以使代码暂时
  功能,然后有机会解决错误。
  
  如果MALLOC_CHECK_设置为1(一),则内存管理功能
  在出现问题时打印出标准错误警告消息
  注意到了。如果我们不知道任何问题,只是
  希望在存在任何问题时得到通知。
  
  如果MALLOC_CHECK_设置为2(两个),则内存管理功能
  发现问题时,请调用abort()。从内部这是最有用的
  调试器或启动应用程序或守护程序的外壳程序。它允许
  内存管理功能开始时将获得回溯
  发现错误,提供最接近错误点的信息
  错误发生了。如果核心是由内存损坏引起的,我们
  了解有关内存分配的更多信息。这对更好
  故障排除并确定在哪里/哪个应用程序覆盖了
  内存地址。
  
  可以通过将MALLOC_CHECK_设置为3来组合设置1和2
  (三)。这将启用以下警告信息的打印
  标准错误(1),并且在发现问题时将调用abort()
  (2)。


有关更多信息,请通过此链接获得更好的理解:
Heap Consistency Checking

10-08 11:24