Мы пытаемся устранить некоторые проблемы с повреждением кучи в наших многопоточных приложениях на C++. В качестве одной из техник мы попробовали добавить -lmcheck в строку с библиотеками приложения. Это приводит к сбою приложения с очевидным повреждением кучи в относительно короткие сроки.
Наше приложение использует как malloc / free, так и new / delete (в зависимости от ситуации).
Один из наших сотрудников поинтересовался, действительно ли -lmcheck является потокобезопасным, и поместил мьютекс вокруг всех вызовов malloc / free. Катастрофы ушли.
Кто-нибудь знает, должен ли -lmcheck поддерживать многопоточность? Интересно, не понимаем ли мы инструмент, который пытаемся использовать, и тем самым вызываем у себя ненужное беспокойство.





Нет, mcheck не является потокобезопасным и не должен использоваться с многопоточными приложениями. Это может вызвать дополнительные проблемы, поскольку нет синхронизации между потоками. Вот ответ Ульриха Дреппера (сопровождающего glibc) на эту тему несколько месяцев назад:
mcheck does not work for multi-threaded code. It cannot possibly do. There is no way to fix this with the technology underlying mcheck.
Я недостаточно знаю о текущей реализации mcheck или об изменениях, которые были внесены в тестируемый код, чтобы ответить на этот вопрос, но я бы, вероятно, держался подальше от этого и нашел бы другие инструменты для использования вместо этого.
Я должен был проверить это, прежде чем мы тратим время на то, чтобы дурачиться. Ну хорошо.
Вот ссылка на то, откуда взялась эта цитата (я полагаю):
http://sourceware.org/bugzilla/show_bug.cgi?id=6547
Дефект документации glibc:
http://sourceware.org/bugzilla/show_bug.cgi?id=12751
был открыт, чтобы помочь избежать этого.
В качестве альтернативы я настоятельно рекомендую valgrind - он будет работать с многопоточными приложениями - хотя он эмулирует потоки, на самом деле он не использует потоки.
Интересно. Означает ли это, что «исправление» спрашивающего, хотя оно, по-видимому, предотвратило сбои, на самом деле недействительно, и что mcheck не может помочь ему с его приложением?