共享库 - 是什么导致 sprof 抱怨"inconsistency detected by ld.so"?



我正试图使用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中的一个错误。

我有点好奇,因为这在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。

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.

如果您使用的是Docker,可能还有其他解释。在我的案例中,分析数据是从Docker容器内运行的进程生成的,我尝试从容器内运行sprof,但收到了与问题中描述的相同的错误。从主机(而不是容器)运行sprof解决了这个问题。

相关内容

最新更新