sprof 无法为我的共享库生成平面分析:ld.so 检测到不一致

sprof 无法为我的共享库生成平面分析:ld.so 检测到不一致

我无法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);
       }

现在打开一个终端,并将目录更改为上面创建的目录,然后运行以下 shell 脚本:

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处理失败。

我发现这个 Stack Overflow 线程什么原因导致 sprof 抱怨“ld.so 检测到不一致”?,但它没有提供解决方案。我想要去sprof工作!

这个问题是否依赖于Linux发行版?我在2016年看到了一个帖子,其中sprof成功了:sprof 平面配置文件名称列格式丑陋

坦白说,我不知道哪个论坛最适合发布这个问题。它看起来像是一个属于堆栈溢出,但 C 程序和分析运行正常;只是sprof在最后阶段无法处理它,这应该是 Linux 相关的问题。那么如果这个问题与 Linux 发行版无关,我应该询问Unix 和 Linux,但如果它只发生在 Ubuntu 上,我应该在这里提出来询问 Ubuntu。好吧,请随意将其迁移到您认为合适的最佳位置;我对此一无所知。

相关内容