我正在尝试使用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中的一个bug。
发布于 2012-06-07 04:36:18
我有点好奇,因为这在OpenSuse 12.x中还是有问题的。我本以为09年左右报告的bug现在应该已经修复了。我猜还没有人真正使用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。
发布于 2019-12-11 20:27:32
在使用多个工作线程时,我在使用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.发布于 2019-06-25 23:42:18
如果你在使用Docker,可能会有另一种解释。在我的例子中,分析数据是从运行在Docker容器中的进程中生成的,我尝试从容器中运行sprof,但收到了与问题中描述的相同的错误。从主机(而不是容器)运行sprof解决了这个问题。
https://stackoverflow.com/questions/6216979
复制相似问题