Я не могу генерировать плоское профильное использование результата sprof
в Ubuntu 16.04.02 (а также 14.04.01). Вот восстанавливаемый пример, адаптированный от man sprof
.
Сначала создайте каталог для эксперимента, затем создайте prog.c
и libdemo.c
файлы внутри:
// prog.c
#include <stdlib.h>
void x1(void);
void x2(void);
int
main(int argc, char *argv[])
{
x1();
x2();
exit(EXIT_SUCCESS);
}
// libdemo.c
#include <unistd.h>
void
consumeCpu1(int lim)
{
int j;
for (j = 0; j < lim; j++)
getppid();
}
void
x1(void) {
int j;
for (j = 0; j < 100; j++)
consumeCpu1(200000);
}
void
consumeCpu2(int lim)
{
int j;
for (j = 0; j < lim; j++)
getppid();
}
void
x2(void)
{
int j;
for (j = 0; j < 1000; j++)
consumeCpu2(10000);
}
Теперь откройте терминал и каталог изменения к вышеупомянутому созданному, затем выполните следующий сценарий оболочки:
cc -g -fPIC -shared -o libdemo.so libdemo.c
cc -g -o prog prog.c -L. -ldemo
export LD_PROFILE=libdemo.so
export LD_PROFILE_OUTPUT=$(pwd) ## use current directory
rm -f libdemo.so.profile
LD_LIBRARY_PATH=. ./prog
sprof -p libdemo.so libdemo.so.profile
Я получаю ошибку:
Несоответствие обнаруживается ld.so: dl-open.c: 717: _dl_open: Утверждение '_dl_debug_initialize (0, args.nsid)-> r_state == RT_CONSISTENT' перестал работать!
libdemo.so.profile
был сгенерирован без проблемы, но sprof
сбои для обработки его.
Я нашел этот поток Переполнения стека, Что заставляет sprof жаловаться на “несоответствие, обнаруженное ld.so”?, но это не предлагает решения. Я хочу добраться sprof
работать!
Действительно ли эта проблема зависит от дистрибутивов Linux? Я видел поток на 2016, где sprof
успешно: sprof плоский столбец имени профиля имеет ужасный формат.
Откровенно говоря, я не знаю, который является лучшим форумом для регистрации этого вопроса. Это похоже на вопрос о программировании, который принадлежит Переполнению стека, но программе C и профильным выполнениям хорошо; это справедливо sprof
этому не удается обработать его в заключительном этапе, который должен быть связанной с Linux проблемой. Затем, если эта проблема независима на дистрибутивах Linux, я должен спросить об относительно Unix & Linux, но если она только происходит на Ubuntu, я должен повысить ее здесь на, спрашивает человечность. Ну, не стесняйтесь перемещать его в лучшее место, поскольку Вы считаете целесообразным; у меня нет подсказки о нем вообще.