【问题标题】:stop Visual Studio from moving my breakpoint, when run "optimization=Enable"运行“优化=启用”时停止 Visual Studio 移动我的断点
【发布时间】:2016-12-20 12:38:18
【问题描述】:

我在我的一个函数 (#A-line) 中添加了一个断点(代码行左侧的红色斜圈)。

public: B(const Vector3& move){
    this->move_=move;
    if(!Vector3::isValid(move)){
        int asdf=0;                //#A
    }
    basis_=Matrix3x3::identity();  //#B
}

如果运行在调试模式,或没有优化的发布模式,程序将正确暂停在#A

如果它在带有优化的发布模式下运行,断点将自行移动到#B
因此,程序每次通过函数都会暂停。

我知道优化后,#A 行会被优化掉。
结果,这条线永远不会通过。
我希望它永远不会在函数中暂停。

实际行为是:它总是停在#B
对我来说,这似乎是 Visual Studio 的一个错误。 (?)

问题

如何让程序在#B处不暂停?
也就是说,如何强制 Visual Studio 不自动移动断点?

【问题讨论】:

    标签: c++ optimization visual-studio-2015 breakpoints


    【解决方案1】:

    下移断点是因为编译器在发布模式下编译时优化了该行代码(即/O2)。所以编译器会尝试找到下一行没有优化的代码,并将断点移到那里。我不知道有没有办法让断点在发布模式下不向下移动,但是您可以通过将光标移动到红点上并单击切换按钮来暂时禁用断点。

    由于断点标记的那行代码是在release模式下优化出来的,所以运行的时候断点其实是没有意义的。

    How to: Enable or Disable Breakpoints

    【讨论】:

    • 如果模式出现在多个地方/文件中,禁用断点会很乏味。在这个解决方案中,每次我想启用优化时,我都必须手动将它们一一禁用……然后再启用它们。
    • @javaLover 有个叫断点的窗口,按Ctrl+Alt+B可以拉出。项目中的所有断点都在那里,您可以通过按Ctrl 并单击断点来选择多个断点,然后很容易在禁用和启用之间切换。
    • 它不能解决问题,但可以缓解大部分不便。感谢。 +1
    【解决方案2】:

    您可以在使用标志 -Og 编译代码时做到这一点。
    导入它是为了让您了解,当您通过优化编译代码时,编译器会更改执行的行顺序以使您的代码更快。
    当您使用该标志进行编译时,您不会获得完全优化,但最不会干扰调试。

    -Og 启用不干扰调试的优化。它应该是标准编辑-编译-调试周期的首选优化级别,提供合理的优化级别,同时保持快速编译和良好的调试体验。

    检查此链接: https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

    【讨论】:

    • 我想我正在使用 Visual Studio 的编译器。您是否建议我更改编译器?如果是这样,它有多难?此解决方案与 Visual Studio 兼容吗?恐怕 gcc 很多有一些我强迫我切换回去的缺点。
    • 你可以在 Visual Studio 上添加标志,查看:msdn.microsoft.com/en-us/library/1yk3ydd7.aspx
    • 从您的链接来看,在 Visual Studio 2015 中不推荐使用 og,我应该使用:/O1、/O2 或 /Ox。我目前正在使用 /O2 (它会导致问题)。你建议 /O1 或 /Ox,对吧?
    • id 你将使用 nore 优化你将无法使用调试权。我实际上不知道 og 是由默认启用的
    • 我只是希望 Visual Studio 不在该行暂停。视觉做的比我需要的多,但以一种不受欢迎的方式。 (移动断点) .... :(
    【解决方案3】:

    如果您的目的是调试发布版本并且特定断点对于调试至关重要,您可以仅关闭特定源文件的所有优化(cpp 的 C++\优化属性)。 当然,这会改变您程序的行为,并不是您的最佳选择。

    另一种可能性是在 //#A 行之前和之后注入一些跟踪命令,这样它们就不会被优化器消除并且您可以中断它们:

    if(!Vector3::isValid(move)){
    //some tracing to force debugger to break here
            int asdf=0;                //#A
    //some more tracing to force debugger to break here
        }
    

    【讨论】:

    • “一些跟踪以强制调试器在此处中断”也会改变程序的行为,例如有点浪费CPU。
    猜你喜欢
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 2016-04-27
    • 2019-11-15
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多