【问题标题】:CodeBlocks Breakpoints Ignoring Scope忽略范围的代码块断点
【发布时间】:2013-03-21 18:15:18
【问题描述】:

我在检查自定义数据类型的某个值的条件语句中设置了一个断点。游戏会中断,但它中断的线完全超出了我的断点范围。观察变量显示它只是在第一次迭代循环时中断,使我的调试条件语句完全无用。

在 Visual Studio 中,调试器会尊重范围,并且在条件语句中放置断点只会在条件评估为真时停止游戏。为什么 CodeBlocks 中的 GDB 调试器不是这种情况?是因为我在 Windows 中使用 GDB 吗?代码如下:

for(int j = 0 ; j < r->components[i].size() ; j++)
    {
        itype_id type = r->components[i][j].type;
        int req = r->components[i][j].count;

        //DEBUGGING ONLY!!!!!!!!!
        if(type == itm_coffee_raw)
        {
            int pleaseStop = 0;
            if(pleaseStop == 0) //BREAKPOINT IS ON THIS LINE
                bool dontstoptillyougetenough = true;
        }

        if (itypes[type]->count_by_charges() && req > 0) //GAME BREAKS HERE
        {
            if (crafting_inv.has_charges(type, req))
            {
                has_comp = true;
                break;
            }
        }
        else if (crafting_inv.has_amount(type, abs(req)))
        {
            has_comp = true;
            break;
        }
    }

【问题讨论】:

  • 您是否启用了任何优化? if 中的那些语句什么都不做,因此编译器可能会在优化过程中丢弃它们。这意味着这些语句将不存在于实际的可执行文件中,因此您不能在它们上放置断点。
  • @JoachimPileborg 是的,我认为这就是问题所在。删除优化标志后,它表现正常。谢谢!如果您将评论更改为解决方案,我会将其标记为解决方案。

标签: c++ debugging gdb codeblocks breakpoints


【解决方案1】:

if 主体中的代码实际上并没有做任何事情,因此编译器可以在优化过程中从可执行文件中将其视为"dead code"remove it。这意味着有问题的代码实际上并不存在于最终的可执行文件中,因此您不能在此处设置断点。

关闭优化(通常在调试时总是很好),它应该可以工作。

【讨论】:

    猜你喜欢
    • 2018-06-24
    • 1970-01-01
    • 2019-03-22
    • 1970-01-01
    • 2017-07-06
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多