Проблема в том, что, по-видимому, существует проблема с libunwind на 64-битных системах, и авторы не могут это сделать.что-нибудь на их стороне, чтобы исправить это (
), поэтому я ищу замену.Есть ли подобный инструмент, который обеспечивает классное графическое представление данных профилирования (например: )
2) В 64-разрядных системах x86-64, хотя сам tcmalloc работает нормально, инструмент cpu-profiler ненадежен: иногда он работает, но иногда вызывает ошибку segfault.Сначала я объясню проблему, а затем некоторые обходные пути.
Обратите внимание, что это влияет только на cpu-profiler, функцию google-perftools, которую необходимо включить вручную, установив переменную среды CPUPROFILE.Если вы не включите профилирование процессора, вы не увидите никаких сбоев из-за perftools.
Подробная информация: Основная проблема заключается в функции backtrace (), которая является встроенной вLibc.Обратный путь довольно прост в обычном случае, но может столкнуться с проблемами, когда приходится возвращаться через сигнальный кадр.К сожалению, процессор-профилировщик использует сигналы для регистрации события профилирования, поэтому каждая обратная трассировка, которую профилировщик делает, пересекает сигнальный кадр.
По нашему опыту, единственное время, когда возникают проблемы, это когда сигнал срабатывает всередина pthread_mutex_lock.pthread_mutex_lock довольно часто вызывается из системных библиотек, особенно при запуске программы и при создании нового потока.
Решение: формат отладки dwarf имеет поддержку 'cfi annotations', которая облегчает распознавание сигналаРамка.Некоторые дистрибутивы ОС, такие как Fedora и gentoo 2007.0, уже добавили аннотации cfi в свои libc.Будущая версия libunwind должна распознавать эти аннотации;эти системы не должны видеть никаких сбоев.
Обходные пути: Если вы видите проблемы с сбоями при запуске cpu-profiler, рассмотрите возможность вставки ProfilerStart () / ProfilerStop () в ваш код, а не настройку CPUPROFILE.Это будет профилировать только те разделы кодовой базы.Хотя мы не проводили много испытаний, теоретически это должно снизить вероятность сбоев, ограничивая генерацию сигнала только небольшой частью кодовой базы.В идеале вы не должны использовать ProfilerStart () / ProfilerStop () вокруг кода, который порождает новые потоки, или может вызвать вызов pthread_mutex_lock!
--- 17 мая 2011