我正在研究多线程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