MALLOC_CHECK多线程与否?

时间:2016-09-01 17:41:57

标签: c malloc

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

2 个答案:

答案 0 :(得分:1)

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

  

功能:int mcheck(void(* 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

答案 1 :(得分:0)

由于您可以在不链接外部库的情况下使用MALLOC_CHECK_(注意尾随下划线)方法,因此可以合理地得出结论,它与libmcheck的实现不同。在任何情况下,这两个都是GNU扩展,记录为替代。

我想你真正想知道的是使用MALLOC_CHECK_是否会破坏动态内存分配的线程安全性。 Glibc指定其malloc()实现是线程安全的(例如,参见https://stackoverflow.com/a/27047048/2402272),正如POSIX所要求的那样。可以想象它的线程安全性被MALLOC_CHECK_的非零值打破,但这似乎不太可能,我找不到这样的文档。

相关问题