我正在研究多线程C应用程序。最近我们发现了一些内存损坏(非常罕见)。确定我们是否使用-lmcheck链接进行了测试。但在我们知道-lmcheck不是线程安全之后。然后我们开始使用MALLOC_CHECK = 3进行测试。在这里,我有一个未解之谜的问题。 -lmcheck和MALLOC_CHECK = 3行为是否相同? MALLOC_CHECK = 3线程是否安全?如果有人回答这个问题,对我来说非常有帮助。我尝试过valgrind,电围栏但没有用。
答案 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_
的非零值打破,但这似乎不太可能,我找不到这样的文档。