在100%的CPU(路径算法中的无限循环)下,Cpack永远不会完成 [英] cpack never finishes, at 100% CPU (infinite loop in path algorithm)

查看:16
本文介绍了在100%的CPU(路径算法中的无限循环)下,Cpack永远不会完成的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我第一次在一个较小的项目上运行cpack,它包含2个组件--3个已编译的可执行文件,生成Debian包。打包没有完成(我让它运行的最长时间是30分钟),它保持在100%的CPU,但不会增加RAM使用率。

使用gdb附加到cpack显示它始终处于cmSystemCools::CollapseCombinedPath和一些字符串操作中。我再次运行时安装了valgrind --tool=callgrind和调试符号,这是按包含时间排序的:

我挂起了代码中的一些循环,因为ColapseCombinedPath被调用了280万次,SplitPath被调用了570万次(!!)在(插入指令的)执行的大约30秒内。

我是自动柜员机,无法隔离MWE,但我在cmake 2.13和2.10(上面的图像来自2.10)中都看到了这种行为。

cmSystemTools::CollapseCombinedPath中单步执行带有断点的代码时,我看到以下内容:

(gdb) break cmSystemTools::CollapseCombinedPath
Breakpoint 1 at 0x55a6f02460a0: file ./Source/cmSystemTools.cxx, line 1371.
(gdb) c
Continuing.

Breakpoint 1, cmSystemTools::CollapseCombinedPath (dir="/..", file="..") at ./Source/cmSystemTools.cxx:1371
1371    in ./Source/cmSystemTools.cxx
(gdb) c
Continuing.

Breakpoint 1, cmSystemTools::CollapseCombinedPath (dir="/", file="..") at ./Source/cmSystemTools.cxx:1371
1371    in ./Source/cmSystemTools.cxx
(gdb) c
Continuing.

Breakpoint 1, cmSystemTools::CollapseCombinedPath (dir="/..", file="..") at ./Source/cmSystemTools.cxx:1371
1371    in ./Source/cmSystemTools.cxx
(gdb) c
Continuing.

Breakpoint 1, cmSystemTools::CollapseCombinedPath (dir="/", file="..") at ./Source/cmSystemTools.cxx:1371
1371    in ./Source/cmSystemTools.cxx
(gdb) c
Continuing.

Breakpoint 1, cmSystemTools::CollapseCombinedPath (dir="/..", file="..") at ./Source/cmSystemTools.cxx:1371
1371    in ./Source/cmSystemTools.cxx
(gdb) c
Continuing.

从堆栈跟踪中,代码从cmCPackDebGenerator.cxx调用,我在其中看到

  for (std::string currentPath : PackageFiles) {
    while (currentPath != WorkDir) {
      // the last one IS WorkDir, but we do not want this one:
      // XXX/application/usr/bin/myprogram with GEN_WDIR=XXX/application
      // should not add XXX/application
      orderedFiles.insert(currentPath);
      currentPath = cmSystemTools::CollapseCombinedPath(currentPath, "..");
    }
  }

所以代码就卡在那里了。可能是我的输入错误(我必须检查),但在这种情况下,cpack绝对不应该挂起。

有人可能会帮这个忙吗?我稍后会尝试挖掘更多内容。

推荐答案

这是一个上游cmake错误,报告为#20011: CPack/Deb: Infinite loop in path algorithm in cpack / debian,由commit 63c0bc92修复。

这篇关于在100%的CPU(路径算法中的无限循环)下,Cpack永远不会完成的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆