设为首页收藏本站
查看: 16371|回复: 1

硬件断点、软件断点、条件断点、指令断点等各类断点区别

[复制链接]

231

主题

64

回帖

2145

积分

管理员

积分
2145
玉米糊 发表于 2013-9-5 10:21:27 | 显示全部楼层 |阅读模式
ARM官方的断点定义

硬件断点
使用非侵入型附加硬件实现的断点。 位置在只读内存 (ROM) 或闪存中时,硬件断点是停止执行的唯一方法。 使用硬件断点通常会导致处理器完全停止运行。 对于实时系统而言,这种方法是不可取的。

软件断点
通过将内存中的指令替换为导致处理器执行异常操作的指令而实现的一种断点。 如果指令存储在只读内存中,则不能使用软件断点,因为这会改变指令内存。 使用软件断点可以在断点期间继续执行中断处理,因此更适于在实时系统中使用。

指令断点
映像中的一个位置,该位置包含一个指令,该指令在执行时会激活一个断点。 通过分配条件限定符可延迟断点激活,对映像的后续执行将由分配给断点的操作确定。

无条件断点
未分配条件限定符的断点。 该断点轻轻一点即可激活,但后续的映像执行由分配给该断点的任何操作确定。

条件断点
分配了一个或多个条件限定符的断点。 在满足所有已分配的条件时该断点将被激活,并将停止执行或继续执行(取决于已分配的操作限定符)。 条件通常会引用断点位置作用域内的程序变量值。
数据断点一种硬件断点,它可在以特定的方式访问给定的位置时激活。 根据需要,该断点还可以查找正在给定位置访问的特定数据值。


概述
下边这段话引自《ARM JTAG 调试原理》
  目前,越来越多的嵌入式开发公司和工程师开始采用JTAG方式的ICE仿真器来进行程序的调试工作。传统的全仿真方式(Full ICE)正在逐渐被使用灵活、成本低廉的JTAG仿真方式所取代。
  JTAG仿真器目前可以满足嵌入式程序调试的所有基本要求,例如:断点设置、单步调试、内存编辑、变量、寄存器观测等。
  断点设置是JTAG仿真器最基本的调试功能。用户需要系统在设置断点处停下来后再进行调试。断点根据原理和用途不同又分为几个不同的种类。本文将简单地介绍一下常用的几种断点类型。

软件断点和硬件断点
  断点可分为硬件断点和软件断点两大类:
  1.硬件断点需要目标CPU的硬件支持,当前流行的ARM7/9内部硬件设计提供两组寄存器用来存贮断点信息,所以ARM7/9内核最多支持两个硬件断点,而ARM11则可以支持到8个硬件断点。这与调试器无关。
  2.软件断点则是通过在代码中设置特征值的方式来实现的。当需要在某地址代码处设置软件断点的时候,仿真器会先将此处代码进行备份保护,然后将预先设定好的断点特征值(一般为0x0000等不易与代码混淆的值)写入此地址,覆盖原来的代码数据。当程序运行到此特征值所在的地址时,仿真器识别出此处是一个软断点,便会产生中断。当取消断点时,之前受保护的代码信息会被自动恢复。

  硬件断点可以设置在任何位置的代码上,包括ROM和RAM;而软件断点由于需要修改相应地址的值,所以一般只能设在RAM上,但是数量可以不受限制。由于硬件断点设置的灵活性,所以是最优先选用的断点资源,但是两个断点往往很难满足工程师进行深入调试的需要,于是软件断点可以作为硬件断点的补充资源来使用。
  由于通常的软件断点只能设在RAM运行的代码上,而随着系统的代码量越来越大,特别是在移动通信领域,扩充大容量的RAM势必会增加产品的成本,所以现在很多系统直接在FlashROM上运行代码。对于这种在FlashROM上运行代码的系统,一般的软件断点是无法设置的,这也是软件断点的局限性。对于这样的系统,只能通过交替使用两个硬件断点满足需要,但是会带来一定的不便。
  要很好的解决这一矛盾,只有使仿真器增加在FlashROM上设置软件断点的功能,拓展仿真器中可供利用的断点资源。例如,日本横河计算机株式会社(YDC)最新推出的高端ARM仿真器-advicePRO,就是第一个支持Flash断点的ICE仿真器产品。
  在FlashROM上设置软件断点的原理与在RAM上设置软断点类似,也是在设定的断点处用特征码替换原有代码,通过识别特征码使断点事件发生。不同的是,在FlashROM上设置软件断点需要对Flash进行擦写操作,这就需要仿真器能够有Flash编程功能,并且能够在尽可能短的时间内完成特征码的写入。完成这一系列的读写操作,就可使在FlashROM上调试代码的工程师获得更充裕的断点资源,从而大大提高了开发效率。
  但是,由于对Flash进行擦写需要一定的时间,所以在执行到Flash断点的时候会感觉到有一个停顿的时间。虽然这一点比RAM上的软件断点要差些,但是相对于给工程师调试工作整体上带来的便利而言,这一点是完全可以接受的。
  设置断点进行调试是最基本的一种调试手段,选择具有丰富断点资源的ICE仿真器,可以明显地提高调试效率。当然,前提是工程师能够灵活使用各种断点资源。

问题解答

Q:RT,平时仿真调试的时候要用断点,但是发现好象一般象IAR,ADS的话好象只支持你设置2个断点(在想设置断点的地方按鼠标右键设置),如果多了的话就无法单步执行了。如果这种断点是硬件断点的话,那么外面经常说的软件断点又是什么呢?应该怎么设置软件断点呢?

Q1:你试试用H-jtag加wiggler(使用IAR),我用它可以设好几个断点,也可以单步运行. 在H-jtag的作者的一篇“ARM JTAG 调试原理.pdf”有详细说明断点的实现原理等。有介绍软断点和硬断点的。

Q:呵呵!终于知道区别了,硬件断点可以用在FLASH里面,而软件断点不能,这估计也是为什么在RAM DEBUG里面可以设置N多的断点,而在FLASH DEBUG的时候就只能设置2个断点的原因了。

Q:我的理解,所谓断点就是让PC停止的地址。所谓硬件断点就是由硬件支持的断点,可以在调试的时候看EICE资源看到使用状况。简单的说,硬件断点有一个专门的寄存器,保存一个地址,就是断点,然后会不停的与PC比较,当匹配的时候就通过一定的机制停止处理器运行,一般其还支持条件断点。而软件断点可通过运行时插入一条特殊的指令来实现,这显然要实现运行时修改程序所以在flash中运行的时候是使用硬件断点,所以出现这样的问题。


回复

使用道具 举报

33

主题

15

回帖

855

积分

管理员

积分
855
米尔小助手1 发表于 2013-10-28 10:44:00 | 显示全部楼层
说得蛮到位的!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录

本版积分规则

Archiver|手机版|小黑屋|米尔科技论坛   

GMT+8, 2024-12-23 09:17 , Processed in 0.066881 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表