是什么导致sprof抱怨“ld.so检测到的不一致”?

时间:2011-06-02 15:56:41

标签: shared-libraries ld libc dlopen sprof

我正在尝试使用sprof来配置一些软件(ossim),其中几乎所有代码都在共享库中。我已经生成了一个分析文件,但是当我运行sprof时,我收到以下错误:

> sprof /home/eca7215/usr/lib/libossim.so.1 libossim.so.1.profile -p > log
Inconsistency detected by ld.so: dl-open.c: 612: _dl_open: Assertion `_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' failed!

我跟随的说明说我需要libc版本至少2.5-34,我有libc版本2.12.2(Gentoo,内核2.6.36-r5)。

我找不到任何关于错误意味着什么的解释,或者(更有趣的是)如何解决它,只有半相关的谷歌搜索结果是针对旧版Skype中的错误。

3 个答案:

答案 0 :(得分:6)

我有点好奇,因为在OpenSuse 12.x中这仍然有问题。我原本以为在09年左右报道的一个错误现在已经解决了。我猜没有人真正使用sprof。 (或者dl-open是如此脆弱,人们害怕触摸它: - )

问题可归结为用作dlopen参数的__RTLD_SPROF标志。 将任何调用dlopen或该标志的简单程序带到第二个arg,你得到相同的失败断言。我使用http://linux.die.net/man/3/dlopen底部的示例程序作为示例

handle = dlopen(argv[1], RTLD_LAZY | __RTLD_SPROF);

从快速查看dl-open.c可以看出,这标志着dl_open所做的一些短路。因此断言中指定的r_flag不会设置为RT_CONSISTENT。

答案 1 :(得分:0)

如果您使用的是Docker,可能还有另一种解释。在我的情况下,分析数据是从Docker容器内运行的进程生成的,我尝试从容器内运行sprof并收到与问题中所述相同的错误。从主机(而不是容器)运行sprof可以解决该问题。

答案 2 :(得分:0)

当使用多个工作程序时,PyTorch DataLoader出现此错误。 Python通过启动许多进程来进行多处理,并且其中一个进程在以只读模式读取文件时(对于CIFAR10数据集)出现此错误。只需重新运行脚本即可解决此问题,因此我相信这是一种偶发的罕见OS错误。如果您设置了num_workers=0,则使用PyTorch也可以帮助解决该错误。