Опция glibc '-lmcheck' и многопоточность

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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
8
0
2 591
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Нет, 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 не может помочь ему с его приложением?

Steve Jessop 24.11.2008 21:36

Я недостаточно знаю о текущей реализации mcheck или об изменениях, которые были внесены в тестируемый код, чтобы ответить на этот вопрос, но я бы, вероятно, держался подальше от этого и нашел бы другие инструменты для использования вместо этого.

Robert Gamble 24.11.2008 21:50

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

Вот ссылка на то, откуда взялась эта цитата (я полагаю):

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

Дефект документации glibc:

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

был открыт, чтобы помочь избежать этого.

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

Другие вопросы по теме