在100%的CPU(路径算法中的无限循环)下,Cpack永远不会完成 [英] cpack never finishes, at 100% CPU (infinite loop in path algorithm)
本文介绍了在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屋!
查看全文