需要帮助调试缓慢的 scons 运行时

2024-04-03

我正在使用 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 并终止运行。同样,在所有事情完成后,还有另一个神秘的延迟;这种延迟也是不可中断的。

我不知道发生了什么,但本应等待 4 秒的时间却等待了 54 秒,这真是令人沮丧!我一直无法找到一种方法让 scons 告诉我在这些延迟期间它在做什么。有谁知道如何获取有关其正在做什么的更多信息?

Update:我使用 profile= 选项运行 scons 来获取分析信息,然后打印出排序列表;以下是前几项:

2016 年 3 月 13 日星期日 17:46:04 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 使用如此多的时间?

Update 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 下。


由于需要花费大量时间进行 unpickle,因此 .sconsign 文件可能已损坏或由于某种原因因数据过多而爆炸,明智的做法是重命名它并查看是否可以解决您的问题。

mv .sconsign.dblite .sconsign.dblist.save

如果是这样,您可以使用以下命令检查旧文件的内容

sconsign .sconsign.dblite.save

这种情况偶尔(实际上很少)发生,我们还无法为开发人员重现它并修复它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

需要帮助调试缓慢的 scons 运行时 的相关文章

  • scons 实用说明(一)

    还在为写一个makefile发愁吗 还在为难记的make参数而苦恼吗 有了scons一切都边的简单了 最近研究了下scons 发现和makefile相比 soncs编译c和c 程序真的太方便了 搞程序什么做好 当然是简单实用最好下面大家就一
  • 斯康斯。使用 Glob 进行递归

    我使用 scons 几天了 有点困惑 为什么没有内置工具用于从给定根开始递归构建源 让我解释 我有这样的源码配置 src Core folder1 folder2 subfolder2 1 Std folder1 等等 这棵树可能更深 现在
  • 如何在 scons 中每次构建后运行一些代码?

    我正在寻找一种方法来注册诸如 scons 中的最终构建回调之类的东西 例如 我现在正在做这样的事情 def print build summary failures SCons Script GetBuildFailures notifyE
  • 如何根据编译器类型在 C 编译器的 SConstruct 中设置选项?

    我需要为 C 编译器设置附加选项 例如添加标志以打开所有警告 具体取决于编译器的类型 例如 对于 MSVC 我应该使用 env Append CPPFLAGS Wall 但对于 mingw gcc 我需要使用 env Append CCFL
  • 如何为使用 SCons 构建的程序内置 gprof 支持?

    问候 这是我的 SConstruct 文件 env Environment env Append CCFLAGS g pg env Program target program1 source program1 c 这也是编译的输出 sco
  • SCons:获取原始文件的绝对路径(就好像我没有设置variant_dir一样)

    我可以用File foo bar abspath获取文件的位置 但如果我设置了variant dir 则返回的路径将位于variant dir而不是原始位置 如果我有duplicate 0设置 那么返回的文件实际上并不存在 显然 SCons
  • 为什么 dlopen 函数内传递的 std::any 的 std::any_cast 会引发错误

    我正在摆弄 c 17 和插件 并且遇到了一个无法解决的错误 在下面的 MWE 中 我可以调用一个本地函数 该函数接受std any 当我尝试阅读内容时 一切都按预期进行 当我通过插件 dlopen 加载这个完全相同的函数时 它正确地看到了a
  • 为什么 clang 在 Scons 下不显示颜色输出?

    使用 Scons 构建时 我可以将其配置为使用 clang 如下所示 env CXX clang 但是 它似乎没有保留 clang 输出的颜色信息 我怎样才能让 scons 保留颜色 根据铿锵文档 http clang llvm org d
  • 如何将 scons 指向安装在我的主目录中的不同编译器?

    我尝试编辑 SConstruct 以指向不同的 gcc 编译器 但它似乎总是使用 usr bin gcc 和 usr bin g 中定义的编译器 env DefaultEnvironment env CC home aaron devel
  • 如何测量 scons 构建的每个组件的构建时间?

    我有一个使用 scons 构建的大型 C 项目 它的构建速度很慢 我想进行一些更改以使其构建速度更快 现在我想集中时间加速构建中最慢的部分 如何找出哪些文件的编译时间最长 我知道这个问题很旧 并且已经被接受 但最近从另一个问题中引用了它 我
  • 如何过滤 SCons Glob 结果?

    我有时想从 SCons 的 Glob 结果中排除某些源文件 通常是因为我想用不同的选项编译该源文件 像这样的事情 objs env Object Glob cc objs env Object SpeciallyTreatedFile cc
  • 如何将交叉编译器与 Scons 一起使用?

    遵循建议关于斯康斯常见问题解答 http www scons org wiki FrequentlyAskedQuestions Why doesn 27t SCons find my compiler 2BAC8 linker 2BAC8
  • SCons - 非标准位置的标头/库

    我正在尝试使用 SCons 编译一个程序 该程序需要一组我已安装在非标准位置的依赖项 我已将依赖项安装在 home dja ocr 中 现在我正在尝试编译主程序 但不知道如何告诉 SCons 在哪里查找库和标头 我已经尝试过 除其他外 sc
  • “cl”未被识别为内部或外部命令

    下面是我在 windows7 中运行 scons 编译器时的错误消息 cl is not recognized as an internal or external command operable program or batch fil
  • 告诉 SCons 不要自动创建目录?

    我正在尝试让 SCons 查看我需要的 git 存储库 并希望使该存储库保持最新 问题是我必须告诉它 git 存储库包含哪些文件才能在构建中使用它们 如果我这样做 SCons 将在尝试克隆存储库之前创建存储库 例如 假设我想克隆 GStre
  • SCons 长命令行 TEMPFILE 与 MinGW

    我正在尝试在 Windows 上使用 SCons 和 MinGW 从 gcc 和 gfortran 对象构建共享库 但在最终链接期间命令行太长 超过 18000 个字符 我知道我需要使用临时文件 响应文件 来传递命令行 但我找不到让 SCo
  • 如何在 scons 中添加 --whole-archive 链接器选项?

    我有一个仅在静态范围内与应用程序交互的库 这需要我将库与 whole archive选项以避免链接器 优化 库 这样做是因为链接器实际上从未看到我的库正在被使用 问题是我还没有找到为 scons 中的特定库添加此链接器选项的方法 env A
  • 无法运行 scons 并出现导入错误

    我已经安装了 scons 2 3 2 并安装了 python 2 4 当我运行 scons 时 我看到以下错误 scons Import failed Unable to find SCons files in usr bin engine
  • 如何在没有自定义代码的情况下从命令行通过 Scons 传递任意编译器 CFLAGS?

    有没有办法写这样的东西 scons CFLAGS fsanitize address fsanitize thread 这只适用于最小的脚本 env Environment env Program target main out sourc
  • vc90上的jsoncpp?

    任何人都有jsoncpp http jsoncpp sourceforge net 在vc90上工作 他们使用构建系统 Scons 我从未听说过 我安装了最新的Scons 找到了一个未记录的scons bat 在我的jsoncpp目录中启动

随机推荐

  • 在 Visual Studio 中查看 var 的类型

    有没有办法查看 a 的类型var在 Visual Studio 2013 代码编辑器中 当我有一个疯狂的时候linq查询 很高兴看到结果类型是什么 我不想更换var关键字与实际类型 我只想看看它是什么 还有一个键盘快捷键会向您显示 将光标放
  • Java GUI repaint() 问题?

    我有一个 JFrame 该 JFrame 包含一个 JButton 我单击 JButton 然后创建了 10 个 JTextField 问题 在通过调整窗口大小 强制重新绘制 之前我看不到它们 只有这样我才能看到创建的 JTextField
  • 安装补丁 19 后,Oracle Forms 6i 在启动时崩溃并显示 0xC0000005 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 UPD 0xC0000005 是STATUS ACCESS VIOLATION 在 winnt h 中定义 这意味着应用程序尝试访问它无法
  • Python super 和设置父类属性

    我在 Python super 以及继承和属性方面遇到了一个非常奇怪的问题 首先 代码 usr bin env python3 import pyglet import pygame class Sprite pyglet sprite S
  • 找到字符串中最长的子串

    我想找到字符串中最长的重复字符序列 ex aabbccc gt ccc aabbbddccdddd gt dddd etc 在第一个示例中 ccc 是最长的序列 因为 c 重复了 3 次 在第二个示例中 dddd 是最长的序列 因为 d 重
  • 如何返回许多 Promise 并在执行其他操作之前等待所有 Promise

    我有一个循环 它调用一个异步执行操作的方法 这个循环可以多次调用该方法 在这个循环之后 我有另一个循环 仅当所有异步工作完成时才需要执行 所以这说明了我想要的 for i 0 i lt 5 i doSomeAsyncStuff for i
  • 使用函数计算 C# 中数组之间的欧几里德距离

    我想计算用户输入的点之间的欧几里德距离 如下所示 static void Main string args int numtest int Parse Console ReadLine int points new int 10 2 for
  • Angular 2 - 打开/关闭默认引导模式

    我不想使用Angular2 引导程序 https github com shlomiassaf angular2 modal or ng2 bs3 模态 https github com dougludlow ng2 bs3 modal正如
  • 获取 Autofac 中接口的所有已注册实现

    我需要从IComponentContext 已注册的列表Type是实现特定接口的 我不需要类型的实际实例 而是想要一个列表Type其中我could获取实例 我想使用此列表在消息总线上生成订阅 如何在 Autofac 中获取接口的所有已注册实
  • 单击按钮获取数据表行数据

    我有一个问题this https plnkr co edit cr4VDR1AZih8WiNxmKg6 p preview项目 我正在尝试创建一个 CRUD 菜单 当点击 编辑 按钮时 该行的数据将被传输到引导模式 并且用户可以从那里进行编
  • 如何访问 PHP 中多选下拉列表中选择的值?

    我在用Jquery 多选小部件 http www erichynds com jquery jquery ui multiselect widget 有一个带有多选选项的下拉列表框 我正在使用 MySql 数据库中的数据填充下拉列表 我无法
  • Google 身份服务 - 如何从经过身份验证的用户获取个人资料/电子邮件信息

    我正在移植一些现有的 js 代码 通过谷歌云平台进行身份验证 因为它们正在迁移到一组新的库 迁移指南 https developers google com identity oauth2 web guides migration to g
  • Cloud SQL 增量到 BigQuery

    我需要针对我正在研究的用例之一提供一些建议 使用案例 我们在 Cloud SQL 中拥有大约 5 10 个表的数据 其中一些被视为查找表 另一些则被视为事务性表 我们需要将其发送到 BigQuery 以生成 3 4 个表 扁平化 嵌套或非规
  • 如何在 JSONP 中处理 twitter 失败鲸鱼

    I load http search twitter com search json callback formatTweets q somehashTag timestamp new Date getTime 我突然得到 Error il
  • FFMPEG 将视频叠加在另一个视频之上

    我已经浏览了 stackoverflow 上的所有问题 但没有一个答案对我有用 我有一个屏幕录制的 mp4 视频和另一个从网络摄像头录制的 mp4 视频 我想将网络摄像头视频覆盖在屏幕录制视频的左上角 我想我终于找到了执行此操作的正确命令行
  • 存储设置:XML 与 SQLite?

    我目前正在编写一个 IRC 客户端 并且一直在尝试找出一种存储服务器设置的好方法 基本上是一个大的网络列表及其服务器 就像大多数 IRC 客户端一样 我决定使用 SQLite 但后来我想以 XML 格式 也许是最终格式 在线免费提供该列表
  • 选择到临时表

    我相信我应该能够做到select into temptable from othertable where temptable以前不存在 但它不起作用 假如说othertable存在并具有有效数据 并且 sometemp不存在 conn l
  • 从列表中删除自定义单词 - Python

    我有一个数据框列 如下所示 我正在考虑删除特殊字符 我希望附加标签 在列表列表中 以便我可以将列附加到现有的 df 这是我收集了这么多 但似乎不起作用 正则表达式尤其给我带来了很大的痛苦 因为它总是返回 预期的字符串或类似字节的对象 df
  • LRPC 的意义何在?为什么有人想要对同一台机器进行远程过程调用?

    根据我对 RPC 远程过程调用 的理解 它们提供了一种向远程计算机发送函数调用 调用等的方法 这样做的明显优点是 您可以拥有一个在机器集群上运行的单个程序 并且可以处理更多请求 更多数据等 但我很困惑LRPC 轻量级RPC http www
  • 需要帮助调试缓慢的 scons 运行时

    我正在使用 scons 构建两个项目 一个项目效果很好 而另一个 更复杂 项目则非常令人沮丧 这是我在为第二个项目运行 scons 时看到的内容 S time scons scons Reading SConscript files lt