我正在使用scons构建两个项目。一个很好用,而另一个(更复杂的)项目非常令人沮丧。以下是我为第二个项目运行scons时所看到的内容:
S time scons
scons: Reading SConscript files ...
<<< Generates some code, output seen in console >>>
scons: done reading SConscript files.
scons: Building targets ...
<<< 30+ second delay, with no output >>>
<<< Building occurs, with output, only 2-3 seconds >>>
scons: done building targets.
<<< 15-20 second delay, no output to console >>>
real 0m54.600s
user 0m2.612s
sys 0m9.236s
$
所以它似乎足够快地读取SConscript文件,但是当它完成时,有一个巨大的30秒延迟,它似乎什么都不做。如果我在这里按下Ctrl-C,延迟仍然存在;它不会处理Ctrl-C并终止运行,直到延迟结束。同样地,在完成所有事情后还有另一个神秘的延迟;这种延迟也是不可中断的。
我不知道发生了什么事,但等待54秒才应该是4秒钟是令人沮丧的!我还没有找到办法告诉我在这些延误期间它做了什么。有谁知道如何获得有关它正在做什么的更多信息?
更新:我使用profile =选项运行scons以获取分析信息,然后打印出已排序的列表;这是前几个项目:
Sun Mar 13 17:46:04 2016 scons.profile.data
1253379 function calls (1208007 primitive calls) in 61.303 seconds
订购者:内部时间,功能名称
ncalls tottime percall cumtime percall filename:lineno(function)
41 32.778 0.799 32.783 0.800 {cPickle.loads}
1 17.691 17.691 17.691 17.691 {cPickle.dump}
456 5.337 0.012 5.337 0.012 {method 'read' of 'file' objects}
24 2.844 0.118 2.844 0.118 {posix.waitpid}
5 0.245 0.049 0.245 0.049 {built-in method poll}
. . .
230 0.016 0.000 0.029 0.000 {cPickle.dumps}
剩余的1000多个条目总计小于0.1秒。请注意,前两个条目匹配两个神秘延迟! (为了完整起见,我还展示了另一个cPickle调用,即使它非常小。)什么可能导致cPickle使用这么多时间?
更新2 :我今天再次运行它,并得到以下时间:
real 1m42.446s
user 0m4.104s
sys 0m11.648s
请注意,这只是编译两个小的.c文件!然后,我重命名.sconsign.dblite并再次运行它;当然,它重建了一切,但已经快得多了:
real 0m34.229s
user 0m28.392s
sys 0m2.932s
好多了!所以现在,我再次使用需要编译的两个文件运行它,我得到了这个:
real 0m3.494s
user 0m2.556s
sys 0m0.460s
现在,这很好!我决定查看.sconsign.dblite和旧版本,并找到以下内容:
$ ls -la .scons*
-rw-rw-r-- 1 rsg rsg 189513 Mar 14 20:31 .sconsign.dblite
-rw-rw-r-- 1 rsg rsg 1440507770 Mar 14 20:23 .sconsign.dblite.save
7600的差异!!!所以现在看来这已经解决了,虽然知道.sconsign.dblite发生了什么,以及如何防止它再次发生会很好。
环境:
$ scons --version
SCons by Steven Knight et al.:
script: v2.1.0.r5357[MODIFIED], 2011/09/09 21:31:03, by bdeegan on ubuntu
engine: v2.1.0.r5357[MODIFIED], 2011/09/09 21:31:03, by bdeegan on ubuntu
engine path: ['/usr/lib/scons/SCons']
Copyright (c) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 The SCons Foundation
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 12.04.5 LTS
Release: 12.04
Codename: precise
$ python --version
Python 2.7.3
此外,Ubuntu在一台体面的Windows 7机器上的VirtualBox v5.0.16下运行在虚拟机中。
答案 0 :(得分:2)
由于花费了大量时间进行取消,因此.sconsign文件可能已损坏或因某些原因导致数据过多而爆炸,重命名它并查看是否能解决您的问题可能是明智之举。
mv .sconsign.dblite .sconsign.dblist.save
如果是,您可以使用
检查旧文件的内容sconsign .sconsign.dblite.save
偶尔会发生这种情况(实际上很少发生),我们还没有能够为开发人员重现它并修复它。