Ребята, не могли бы вы рекомендовать инструмент для обнаружения повреждения памяти на многопоточном сервере, построенном на С++, и работающем под Linux x86_64? В настоящее время у меня возникает следующая проблема: каждые несколько часов мой сервер выходит из строя с помощью segfault, а дамп ядра показывает, что ошибка происходит в malloc/calloc, что определенно является признаком повреждения памяти где-то.
На самом деле я уже пробовал некоторые инструменты без большой удачи. Вот мой опыт:
-
Valgrind - отличный инструмент (я бы даже сказал лучше), но он слишком замедляет работу сервера, что делает его непригодным для производства. Я попробовал это на сценическом сервере, и это действительно помогло мне найти некоторые проблемы, связанные с памятью, но даже после их исправления я все равно получаю сбои на рабочем сервере. Я запускал свой сценический сервер под Valgrind в течение нескольких часов, но до сих пор не мог обнаружить серьезных ошибок.
-
ElectricFence считается настоящим болотом памяти, но я даже не мог его нормально работать. Он практически сразу же исчезает на сцене в случайных странных местах, где Valgrind вообще не обнаруживает никаких проблем. Может быть, ElectricFence не поддерживает многопоточность?.. Я понятия не имею.
-
DUMA - такая же история, как ElectricFence, но еще хуже. В то время как EF создавал дампы ядра с удобочитаемыми обратными трассами, DUMA показывает мне только "?????" (и да сервер построен с флагом -g).
-
dmalloc - я настроил сервер, чтобы использовать его вместо стандартных подпрограмм malloc, однако он зависает через несколько минут. Прикрепление gdb к процессу показывает, что он висел где-то в dmalloc: (
Я постепенно схожу с ума и просто не знаю, что делать дальше. У меня есть следующие инструменты для проверки: mtrace, mpatrol, но, возможно, у кого-то есть лучшая идея?
Я бы очень признателен за любую помощь по этой проблеме.
Обновление: Мне удалось найти источник ошибки. Однако я нашел его на сцене сервера, а не на производстве, используя helgrind/DRD/tsan - между несколькими потоками произошел datarace, что привело к повреждению памяти. Ключ должен был использовать правильные подавления valgrind, поскольку эти инструменты отображали слишком много ложных срабатываний. Тем не менее, я действительно не знаю, как это можно обнаружить на производственном сервере без каких-либо значительных замедлений...