2008-11-24 2 views
7

Мы пытались выследить некоторые проблемы с повреждением кучи в наших многопоточных приложениях на C++. В качестве одного из методов мы попытались добавить -lmcheck в строку библиотек приложения. Это приводит к сбою приложения с явным повреждением кучи в относительно коротком порядке.опция «-lmcheck» glibc и многопоточность

В нашем приложении используется как malloc/free, так и new/delete (в зависимости от ситуации).

Одна из наших команд задавалась вопросом, действительно ли -lmcheck был потокобезопасным и помещал мьютекс вокруг всех вызовов malloc/free. Аварии ушли.

Кто-нибудь знает, должен ли -lmcheck поддерживать многопоточность? Интересно, просто ли мы неправильно понимаем инструмент, который мы пытаемся использовать, и тем самым вызывая ненужное беспокойство.

ответ

7

Нет, mcheck не является потокобезопасным и не должен использоваться с многопоточными приложениями. Это может привести к дополнительным проблемам, поскольку между потоками нет синхронизации. Вот ответ Ульриха Дреппера (glibc maintainer) по этому вопросу несколько месяцев назад:

mcheck не работает для многопоточного кода. Возможно, он не может . Невозможно исправить с помощью технологии, лежащей в основе mcheck.

+0

Интересно. Означает ли это, что «исправление» опросчика, хотя оно, по-видимому, предотвратило аварии, на самом деле не является действительным, и что mcheck не может помочь ему с его приложением? – 2008-11-24 18:36:48

2

Я должен был проверить это, прежде чем мы потратили время на обманывание. Хорошо.

Вот ссылка, где это цитата из (я считаю):

http://sourceware.org/bugzilla/show_bug.cgi?id=6547

Glibc документация дефект:

http://sourceware.org/bugzilla/show_bug.cgi?id=12751

был открыт, чтобы избежать других от удара этого ,

0

В качестве альтернативы я могу очень порекомендовать valgrind - он будет работать с многопоточными приложениями - хотя он эмулирует потоки, он фактически не использует потоки.

Смежные вопросы