为什么调试执行顺序与c++中的代码顺序不匹配?

问题描述 投票:0回答:1

我是 C++ 新手。当我在Clion中调试时,我发现使用Step over(F8)的执行顺序与实际代码的顺序不符。到目前为止,我认为最可能的原因是编译器优化。我不认为我已启用此功能并且正在使用 LLDB 进行调试。

这似乎与这个答案相关: 为什么我的断点没有按顺序运行? GCC 和 C

这是我的代码:

int depthSum(vector<NestedInteger> &nestedList) {
        deque<pair<int, NestedInteger>> q;
        int level = 1;
        for (NestedInteger n : nestedList) {
            q.push_back({ level, n});
        }

        int res = 0;
        while (!q.empty()) {
            auto pair = q.front();
            q.pop_front();
            if (pair.second.isInteger()) {
                level--;
                res = (level * (pair.second.getInteger()));
                cout << res << endl;
            } else {
                level++;
                for (NestedInteger nestedInteger : pair.second.getList()) {
                    q.push_front({level, nestedInteger});
                }
            }
        }
        return res;
    }

当断点步到

res = (level * (pair.second.getInteger()));
处再按F8会跳转回
level--
,再按F8跳转到
res = (level * (pair.second.getInteger()));
,再次按F8会跳转到
cout << res << endl;

标注顺序:

这真的是因为代码重新排序吗?顺便说一句,虽然调试顺序与预期不符,但代码逻辑没有错误,但我在项目中没有找到一些开放的代码优化选项。


添加CMake的配置文件

我试图避免优化,但问题仍然存在。

----------------------------已更新

这是有效的,但我不知道为什么 -O0 不起作用。从逻辑上讲 -O0 应该有效,因为这避免了所有优化。

-DCMAKE_C_FLAGS_DEBUG:STRING="-g -O1" -DCMAKE_CXX_FLAGS_DEBUG:STRING="-g -O1"
c++ debugging compiler-optimization lldb instruction-reordering
1个回答
0
投票

您可能处于发布模式配置... 所以将其更改为调试模式

© www.soinside.com 2019 - 2024. All rights reserved.