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

20

我正在尝试使用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
据我所知,这是glibc中的一个错误,如果你谷歌搜索RT_CONSISTENT并查看所有redhat bugzilla条目,它就会出现。我现在使用oprofile代替它。 - Matthew Smith
不知道是否有效,但是这个答案中有关于使用sprof处理.so文件的信息:https://dev59.com/RXI-5IYBdhLWcg3weoJO - Alexis Wilke
3个回答

7

我有点好奇,因为在OpenSuse 12.x中仍然存在此问题。我本以为09年左右报告的错误早已被修复了。我猜想可能没有人真正使用sprof。(或者dl-open太脆弱了,人们害怕去碰它 :-)

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

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

从我对dl-open.c的快速查看中可以看出,这个标志位可以使dl_open执行过程中的某些步骤被跳过。因此,在断言中指定的r_flag没有设置为RT_CONSISTENT。


3
有些烦人。许多人建议使用oprofile,但到目前为止我也没能成功构建它。你有没有关于如何对共享库进行性能分析的建议? - dirac3000

4

当使用多个工作进程时,我在PyTorch DataLoader中遇到了这个错误。Python通过启动许多进程来进行多进程处理,其中一个进程在读取只读模式下的文件(用于CIFAR10数据集)时出现了此错误。仅需重新运行脚本即可解决该问题,因此我认为这是某种偶发性罕见的操作系统错误。如果您在PyTorch中设置num_workers=0,也可能有助于解决此错误。

以下是完整的错误信息,以供参考:

Inconsistency detected by ld.so dl-open.c   272 dl_open_worker  Assertion `_dl_debug_initialize (0, args->nsid)->r_state == RT_CONSISTENT' failed!
Traceback (most recent call last):
  File "/miniconda/envs/petridishpytorchcuda92/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 724, in _try_get_data
    data = self._data_queue.get(timeout=timeout)
  File "/miniconda/envs/petridishpytorchcuda92/lib/python3.6/queue.py", line 173, in get
    self.not_empty.wait(remaining)
  File "/miniconda/envs/petridishpytorchcuda92/lib/python3.6/threading.py", line 299, in wait
    gotit = waiter.acquire(True, timeout)
  File "/miniconda/envs/petridishpytorchcuda92/lib/python3.6/site-packages/torch/utils/data/_utils/signal_handling.py", line 66, in handler
    _error_if_any_worker_fails()
RuntimeError    DataLoader worker (pid 272) exited unexpectedly with exit code 127. Details are lost due to multiprocessing. Rerunning with num_workers=0 may give better error trace.

1
我也遇到了这个错误,在从Python 3.7切换到Python 3.8以及从PyTorch 1.4.0升级到1.7.1之后。代码在Docker容器内运行。看起来这不是偶发性的错误... - Klamer Schutte

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接