Я потратил весь день, пытаясь сделать gperftools за работой :/
Я устал от разных версий libunwind, но когда мне удалось установить его, я получал следующую ошибку «Таймер профилирования истек» всякий раз, когда я использовал std :: system.
main.cpp:
#include <cstdlib>
int main(int argc, char** argv) {
std::system("cut -f1 anyExistingFile | sort > newSortedFile");
return 0;
}
Я устал выполнять профилирование следующим образом:
$ g++ main.cpp -o myApp -std=c++11
$ env CPUPROFILE=out.prof LD_PRELOAD="/usr/local/lib/libprofiler.so" ./myApp
Profiling timer expired
PROFILE: interrupts/evictions/bytes = 0/0/64
тогда я сделал:
$ env LD_PRELOAD="/usr/local/lib/libprofiler.so"$ sort file
$ env LD_PRELOAD=
$ sort file
сортировка не работала, когда для меня был установлен LD_PRELOAD «/usr/local/lib/libprofiler.so» !!
Затем я попытался использовать статические версии библиотеки:
$ g++ main.cpp -o myApp -std=c++11 /usr/local/lib/libtcmalloc_and_profiler.a
$ env CPUPROFILE=out.prof ./myApp
ничего не произошло, и out.prof не был создан!
поэтому мне интересно, почему я получаю «Таймер профилирования истек», когда я использую std :: system (sort)? и это правильный способ использовать статическую версию библиотеки gperftools?
P.S .: 64-битная, gperftools = 2.5, libunwind = 1.1, Linux Ubuntu 16.04.1
Кажется, проблема в том, что когда вы устанавливаете LD_PRELOAD, вы фактически устанавливаете его для всего в текущей работе оболочки, включая дочерние процессы, которые порождает ваша программа. То же самое происходит с переменной окружения CPUPROFILE. Таким образом, профилировщик процессора также активируется для сортировки. И похоже, что что-то в программе сортировки сбрасывает обработчик сигнала SIGPROF по умолчанию без фактической перезагрузки соответствующего интервального таймера. Поэтому, когда сортировка завершает достаточно работы, она получает сигнал, и обработчик по умолчанию выходит из программы. Простой обходной путь — отсоединить CPUPROFILE от вашей программы сортировки. Например.:
#include <cstdlib>
int main(int argc, char** argv) {
std::system("cut -f1 /usr/share/dict/american-english-insane | CPUPROFILE='' sort > /tmp/insane");
return 0;
}
Что касается того, почему статическое связывание не сработало, это потому, что ничто в вашей программе не тянет символы профилировщика, поэтому фактически становится недопустимым w.r.t. профилирование.
Других решений пока нет …