声明可变大小 std::vector 时代码中的 LLDB 调试冻结

LLDB debugging freezing in code when declaring variable-size std::vector

提问人:BENG 提问时间:9/19/2023 更新时间:9/19/2023 访问量:28

问:

我在 M2Pro Macbook 上使用 VSCode。当单步执行某个方法的代码时,VSCode 的调试器会冻结并且无法加载局部变量。经过大量的催促我的代码,我找到了直接触发它的原因,但我不知道如何修复它,因为代码在不调试时运行得很好。

下面是冻结调试器的代码片段:

int max_edges = 0;
for (int i=0; i<N_points; i++) {
    max_edges += point_cache.pairedEdgeLen(points_attatched[i]);
}

std::vector<int> TEST_VECTOR(max_edges);

在我的原始代码中,被替换为一个对象,该对象是一个自定义哈希表集类,它利用 .必须使用初始大小进行初始化,该大小在添加元素时保持不变,以优化性能。我在这里使用,因为这就是导致问题的原因。我发现调试器一旦进入一个以可变大小声明 a 的方法,它就会冻结。此外,如果我要替换,例如,我看到调试器将以巨大的大小初始化此向量。此映像来自 VSCode 的方法中的断点,但在初始化之前。TEST_VECTORIdSetstd::vectorIdSetstd::vectorlldb-mistd::vectorstd::vector<int> TEST_VECTOR(max_edges);std::vector<int> TEST_VECTOR(5);intTEST_VECTOR

enter image description here

我有几个问题。

像这样初始化向量是不好的形式吗?我假设 C++ 没有为这个向量分配荒谬的空间量,然后在它到达行时调整它的大小。我正在用作编译器。我猜这是.clang++lldb

调试时如何解决此问题?我非常想逐步执行此代码。我是否应该在方法的开头初始化具有恒定长度的向量,然后在到达我本来会声明的行时调整大小?

编辑:我发现,当在方法的头部声明向量时,用大小初始化向量。lldb0

C++ VSCode调试器 LLDB

评论

0赞 user4581301 9/19/2023
您正在做的事情应该没问题,通常比分配然后调整大小更可取。似乎正在发生的事情是调试器尝试加载尚未在范围内的变量的所有数据,这对调试器来说不是良好的行为。克罗姆只知道它会得到什么垃圾。
0赞 Jim Ingham 9/20/2023
命令行 lldb 会以某个合理的值截断容器的显示(并附有注释告诉您它这样做了),并且 UI 也可以(并且建议)这样做。布置一百万个数组元素的四分之一并没有真正的帮助。
0赞 Jim Ingham 9/20/2023
您也可以尝试将 lldb-vscode 适配器更改为 lldb,而不是 lldb-mi 适配器。我认为在很长一段时间内没有人在 lldb-mi 上工作过,而 lldb-vscode 正在积极开发中。他们可能会更好地处理这种情况,如果他们不这样做,您可以向项目(一般 lldb 项目的一部分)提交错误。

答: 暂无答案