Таймер профилирования истек при использовании gperftools с сортировкой

Я потратил весь день, пытаясь сделать 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

0

Решение

Кажется, проблема в том, что когда вы устанавливаете 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. профилирование.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]