如何使用断点进行调试


9

断点是查看编译器如何运行代码的好方法。现在我的问题是,调试代码时是否可以使用断点?

Answers:


9

如Majenko的回答所述,Arduino IDE不提供断点机制,但Atmel Studio确实支持断点。[*]

但是,如果您有一个开关和一个LED,则可以以提供断点某些好处的方式跟踪程序的进度。您将添加一个子程序,例如BPReport(),该程序通过串行输出或LCD报告关键变量的值,然后点亮LED并等待直到按下和释放开关为止,并带有反跳。BPReport()想要无条件断点的任何地方都可以调用例程。对于条件断点,可以有一个例程BPReportIf(cond)BPReport()如果cond为true 则调用 该例程。如果您不想通过串行输出,则可以使用多个LED或LCD,并且如果需要外部中断控制,则可以使用多个开关(例如,cond可以测试其中一个额外的开关)。

[*]一些硬件调试器每次添加,更改或删除断点时都会修改下载的代码。这种用法将使闪存消耗的速度比偶尔下载闪存的速度更快。如果芯片已大量用于此类调试,请不要在生产系统中使用该芯片。


4

尽管马延科的回答是正确的,但还有其他选择。

至于majenko所说的真正的硬件调试,我会说:

  1. 安装并使用真正的IDE,例如Atmel Studio或称为sloeber(我是作者)的arduino eclipse插件,以及
  2. 使用完整的硬件调试器或板上安装的硬件(例如Arduio zero)或使用其他调试技术(例如允许USB调试的ESP8266)的硬件

完全不同类别中的另一个调试选项是组织代码,以使决策逻辑(独立于硬件)和操作(独立于硬件)完全分开。

然后将您的草图编译为本地程序,并在本地计算机上调试“决策逻辑”。此方法不允许进行“硬件调试”。此方法还可以进行单元测试。

请注意,您的本地计算机可能是32位或64位苦味剂,而大多数Arduino是8位苦味剂,这将导致数据类型的差异,这是使用此方法时需要特别注意的一点。


4

Arduino的调试库提供了一个简单的基于目标的调试器Arduino的草图。调试命令直接添加到草图中。在断点和断言上启动调试器命令外壳。

在此处输入图片说明

上面的屏幕截图显示了在Arduino Mega上运行的示例草图,其中Arduino输出由应用程序使用,而Serial1用于调试器外壳。

草图调试命令

  • ASSERT(cond)检查断言条件。如果为false,则调用调试外壳程序。草图无法继续。
  • BREAKPOINT()调用调试外壳程序。
  • BREAK_IF(cond)如果条件为true,则会调用调试外壳程序。
  • CHECK_STACK(room)检查堆栈上是否有空间(字节)。如果为false,则调用调试外壳程序。
  • DEBUG_STREAM(dev)使用给定的流设备进行调试会话。通常是串行的。
  • OBSERVE(expr)将表达式打印到调试流。
  • OBSERVE_IF(cond,expr)如果条件为true,则将表达式打印到调试流。
  • REGISTER(var)注册一个变量,以从调试Shell进行访问。调试Shell命令

调试Shell命令

  • ?VARIABLE 打印变量地址和值。
  • @VARIABLE 打印指针变量地址和参考值。
  • backtrace 打印简单的调用栈。
  • 命令 打印命令列表(另请参阅帮助)。
  • data 打印数据区域的内容,即全局变量。
  • 休假调试shell,并继续草图的执行。
  • 打印堆的内容,即动态分配的数据。
  • 帮助 打印命令列表。
  • 内存打印内存状态。
  • 退出 停止草图。
  • 堆栈 打印堆栈的内容,即调用框架,参数,返回地址。
  • 变量 打印已注册变量的列表。
  • 在那里 打印的源代码文件和行那里调试shell被调用。

所有调试外壳程序命令都可以缩写为单字符命令。有关更多详细信息,请参见自述文件。安装细节,示例草图和基准测试。


1
Mikael的捐赠库使您可以设置条件断点,打印变量的值,内存状态,调用跟踪以及在断点处检查和更改变量。Pro:不需要硬件($$),在Flash上​​不那么费力(就像使用硬件调试器设置和删除断点一样)。....
JRobert

1
....缺点:如果检查对时间要求严格的代码,则对程序的代码空间,某些RAM空间以及运行时的影响更大;一些学习曲线,可在(随后删除)库调用中进行编译;当您发现需要断点的位置时,需要预测断点的位置或重新编译它们。缺点不是对Mikael作品的批评。他们采用了这种技术。
JRobert

1
@JRobert Nice Pro-Con总结!我试图通过允许调试器定制来解决一些缺点。有一组定义,这些定义将允许对足迹敏感的应用程序将调试外壳降到最低。与嵌入式系统的任何调试器一样,很难调试具有断点的时间关键(连续)代码。唯一的选择是观察点。这些可以通过使用跟踪缓冲区进行优化,并删除关键时间代码中的串行输出。
Mikael Patel

3

不在Arduino IDE中。

你需要:

  1. 安装并使用真实的IDE,例如Atmel Studio,以及
  2. 使用完整的硬件调试器

没有提供使用引导加载程序通过UART / USB接口进行调试的规定。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.