【问题标题】:MPLAB X + XC8 break at wrong lineMPLAB X + XC8 在错误的行中断
【发布时间】:2018-03-28 14:29:26
【问题描述】:

我遇到了一个非常烦人的问题,已经花费了几个月的时间。

我在 MPLAB X 中有一个项目。当我使用行断点时,它在调试我的项目时根本不会在正确的行上中断。

我使用的是 MPLAB X v4.15

这是实际发生的情况:

无论断点在哪里,调试器都不会在正确的位置中断。

  • 如果我在某处放置断点,它总是会在错误的位置中断
  • 如果我重新开始调试,它会在 在同一个错误位置中断
  • 如果我更改断点位置,程序实际中断的位置会有所不同,但在我重新启动程序时会再次保持不变。

更多信息:

为什么会这样?

遇到这个问题的人多吗?

我该如何解决?

编辑

遗憾的是,K_Trenholm 建议的解决方案对我不起作用。我在一个函数中放置了 3 个“NOP”,但它没有按照您的建议工作。见下图:

但我得到了什么:

我想补充一点,我为 NOP 尝试了各种断点组合。无论我做什么,对于这种情况,程序总是在同一台 PC 上停止,如上图所示。

感谢您的回复,甚至对如何解决它有任何想法都非常有帮助。 如果您有任何其他想法,如果您能分享,我将不胜感激!

【问题讨论】:

    标签: pic microchip mplab 8-bit xc8


    【解决方案1】:

    想到两件事:

    1) 编译器优化可能会在调试时导致断点位置/值出现问题。调试时,关闭优化(如果可能,在您的示例中,您似乎在代码大小方面遇到了天花板)。

    2) 断点“打滑”。见http://microchipdeveloper.com/tls0201:skid-effect#top-of-page

    根据我所见,解决此问题的一种方法是在您计划放置断点的行之后放置几个 NOP 指令。这将确保任何“打滑”都不会执行更多代码。

    【讨论】:

    • 你好 K,很遗憾这对我不起作用。我在一个函数中放置了 3 个“NOP”,但它没有按照您的建议工作。我在不同的 nop 上尝试了不同的断点,就像这 3 个的每个组合一样。
    • 另外我想补充一下,我的同事,软件版本相同,MPLAB X版本和XC8版本相同,也有同样的问题。
    【解决方案2】:

    发生中断的指令将始终完全执行,流水线中的任何未决指令也将执行。对于单周期指令,这会增加一个指令滑行。对于多周期指令和分支,它增加了多个周期。所以如果你想避免 要将调试器跳转到子例程中,您必须在断点后面包含一些 Nop

    示例:

    void main (void)
    {
        int x = 0;
    
        x++1;                  //put Breakpoint here
        Nop();
        Nop();
        Nop();                 //Debugger will stop here
        foo(x);                //so foo() is not called
    }
    

    根据所使用的 MCU,调试器会在遇到断点时引入“打滑效应”。调试会话将在暂停前最多执行两条额外指令。

    【讨论】:

    • 请添加一些描述
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多