代码修改方法和代码修改设备的制作方法

文档序号:6461473阅读:137来源:国知局
专利名称:代码修改方法和代码修改设备的制作方法
技术领域
本发明涉及计算M件测试和调试技术,尤其涉及用于修改程序的目 标代码以允许存储器访问跟踪的代码修改(instrumentation)方法和代码修 改设备。
背景技术
存储器访问,是计算机软件测试和调试领域的重要技术。例如,存 储器访问跟踪可用于存储器泄漏检测、数据竟争检测等方面。
为了进行存储器访问跟踪,通常需要对计算;^序代码(例如源代码 或目标代码等等)进行修改,在存储器访问指令(例如写入存储器的指令) 之前或之后加入用于获得和记录有关存储器访问指令的信息,例如目标地 址(被写入的地址)、写入数据长度、访问类型(例如加载或存储)、线程标 识等等的例程或指令,或是用于调用这些例程或指令的指令。
与未i^行这种l务改的程序代码相比,经过修改的程序代码增加了用于 存储器访问跟踪的开销,尤其是在程序代码包含较多存储器访问指令或存 储器访问指令执行次数较多的情况下。
因此,需要一种能够降低这种开销的技术。

发明内容
本发明的目的是提供一种代码修改方法和代码修改设备,用于修改程 序的目标代码以允许存储器访问跟踪的,使得能够降低存储器访问跟踪的 开销。
本发明的实施例提供了 一种代码修改方法,用于修改程序的目标代码 以允许存储器访问跟踪,包括识别目标代码中要循环执行的目标代码块; 识别目标代码块中在目标代码块的循环执行期间要访问的存储器地址不 发生改变的至少一个存储器访问指令;和将用于跟踪所述至少一个存储器 访问指令所要进行的存储器访问的例程插入在目标代码块之外。本发明的实施例还提供了 一种代码修改设备,用于修改程序的目标代
码以允许存储器访问跟踪,包括循环识别装置,被配置为识别目标代码 中要循环执行的目标代码块;指令识别装置,被配置为识别目标代码块中 在目标代码块的循环执行期间要访问的存储器地址不发生改变的至少一 个存储器访问指令;和插入装置,被配置为将用于跟踪所述至少一个存储 器访问指令所要进行的存储器访问的例程插入在目标代码块之外。
根据本发明的实施例,对于循环执行的存储器访问指令,与其相应的 跟踪指令M在循环之外而不是循环内,减少了跟踪指令的执行次数,但 同样能够,被访问的存储器地址。


参照下面结合附图对本发明实施例的说明,会更加容易地理解本发明 的以上和其它目的、特点和优点。在附图中,相同的或对应的技术特征或 部件将采用相同或对应的附图标记来表示。
图l是示出根据本发明一个实施例的代码修改设备的结构的框图。
图2是示出根据本发明一个实施例的代码修改方法的流程图。
图3A和3B是示出插入装置插入的例程的图例。
图4是示出其中实现本发明的计算机的示例性结构的框图。
具体实施例方式
下面参照附图来说明本发明的实施例。应当注意,为了清楚的目的, 附图和说明中省略了与本发明无关的、本领域普通技术人员已知的部件和 处理的表示和描述。
图1示出了说明根据本发明一个实施例的代码修改设备102的结构的 框图。如图1所示,代码修改设备102包含循环识别装置103、指令识别 装置104和插入装置105。循环识别装置103识别目标代码101中循环执 行的目标代码块。指令识别装置104识别目标代码块中要访问的存储器地 址不发生改变的存储器访问指令。插入装置105将用于跟踪例程或指令插 入在目标代码块之外。
目标代码101可以是例如二进制可执行程序。目标代码101可包括有代码段。代码段由可执行指令或组成。每个指令具有一定的格式。根据指 令所包含的信息能够确定指令的类型、操作数、寻址方式等。例如在指令 格式中可规定操作码、源寄存器、目标寄存器和其它信息,根据操作码可 以确定指令是否存储器访问指令(例如加载指令和存储指令)。
寻址方式是指形成源和目标操作数的地址的方式。涉及存储器访问的
寻址方式的例子包括但不限于 直接寻址
操作数在存储器中,指令直接包含操作数的存储器地址。
* 寄存器间接寻址
操作数在存储器中,操作数的存储器地址在寄存器中。
* 寄存器相对寻址
操作数在存储器中,操作数的存储器地址是寄存器的内容加上偏移 之和。
* 基址加变址寻址
操作数在存储器中,操作数的存储器地址是基址寄存器加上变址寄 存器的内容。
* 相对基址加变址寻址
操作数在存储器中,操作数的存储器地址是基址寄存器和变址寄存 器的内容加上偏移之和。
下面将结合图2来说明图1所示的代码修改设备102的各部分的操作。
图2是示出根据本发明一个实施例的代码修改方法的$錄图。如图2 所示,方法在步骤201开始。在步骤203,由循环识别装置103识别目标 代码IOI中的循环,即在满足条件时循环执行的目标代码块。可利用已有 的技术来识别这样的目标代码块。
接着在步骤205,指令识别装置104针对循环识别装置103识别出的 每个目标代码块,识别目标代码块中在目标代码块的循环执行期间要访问 的存储器地址不发生改变的存储器访问指令。例如,指令识别装置104 逐个确定目标代码块中的指令是否存储器访问指令。如果是存储器访问指 令,则确定在该目标代码块中是否存在修改该存储器访问指令中的^Mt地址的指令。如果不存在修改操作数地址的指令,则指令识别装置104 将该存储器访问指令识别为在目标代码块的循环执行期间存储器地址不 发生改变的存储器访问指令。
判断是否修改操作数地址的方法取决于^Mt数的寻址方式。对于各种
寻址方式,可将操作数地址看作是一个算术表达式的计算结果。例如对于 寄存器相对寻址,算术表达式为"寄存器的内容+偏移量"。算术表达式如 果不包含变量(例如寄存器),或者其所有变量在目标代码块执行期间不发 生改变(即在目标代码块中不存在修改这些变量的指令),则认为该操作数 地址在目标代码块执行期间不发生改变。
另外或可选地,取决于跟踪目的的不同,指令识别装置104可被配置 为识别采用特定寻址方式的存储器访问指令。 一般而言,上述特定寻址方 式包括直接寻址、寄存器间接寻址、寄存器相对寻址、基址加变址寻址和 相对基址加变址寻址中的 一种或多种。
另外或可选地,取决于跟踪目的的不同,指令识别装置104可被配置 为特定访问类型的存储器访问指令,例如读存储器的指令、写存储器的指 令,或读写存储器的指令。
接着在步骤207,插入装置105将用于跟踪由指令识别装置104识别 出的存储器访问指令的存储器访问的例程插入在目标代码块之外。
图3A示出了插入装置105插入的例程的示例。如图3A所示,假设 指令识别装置104识别出目标代码块301中的一个指令"lwz r3, 72(r3)", 用于将地址为寄存器r3的内容加72(即,[r3+72)的存储器单元中的字加 载到寄存器r3中。该指令的操作数地址[r3+ 72在其所处的目标代码块 301执行期间未发生改变。针对该指令,插入装置105可在目标代码块301 之后插入跟踪例程302。当然,跟踪例程302也可插入在目标代码块301 之前。
如图3A所示,跟踪例程302可包括三个部分。第一个部分为指令
,用于保存例程会用到的三个寄存器r3、 r4、 r5的初值。 一般而 言,对于例程执行中会破坏的现场部分,需要在例程开始处提供用于M 例程开始之前,即例程插入位置的当前执行现场的指令。第二个部分为指 令[04-[07,用于记录目标代码块301中存储器访问指令"lwz r3, 72(r3)" 的类型、读取长度和读W^址信息。 一般而言,可根据跟踪的需要来确定 要记录的有关存储器访问的信息。第三个部分是指令[08H10,用于恢复例程用到的三个寄存器r3、 r4、 r5的初值。 一般而言,这部分指令是用 于恢复所M的当前执行现场的指令。
回到图2,方法在步骤209结束。
在一个优选实施例中,循环识别装置103可以在已识别的目标代码块 中进一步识别更小的循环执行的目标代码块。指令识别装置104被配置为 针对循环识别装置103识别的每个循环进行其处理。
在另 一个优选实施例中,插入装置105可以被配置为针对同一 目标代 码块中识别出的至少两个存储器访问指令,插入用于M插入位置的当前 执行现场的指令,插入用于记录这些存储器访问指令所要进行的存储器访 问的跟踪所需的信息的指令,和插入用于恢复所保存的当前执行现场的指 令。图3B示出了在此情况下插入装置105插入的例程的示例。如图3B 所示,假设指令识别装置104识别出目标代码块303中的两个指令"lwz r3, 72(r3)"和"lwz r4, 80(r4)",分别用于将地址为寄存器r3的内容加72(即, [r3+ 72)的存储器单元中的字加载到寄存器r3中,和用于将地址为寄存 器r4的内容加80(即,[r4+ 80)的存储器单元中的字加载到寄存器r4中。 该两个指令的操作数地址[r3+ 72和[r4〗+ 80在其所处的目标代码块303 执行期间未发生改变。针对这两个指令,插入装置105可在目标代码块 303之后插入跟踪例程304。
如图3B所示,跟踪例程302包括三个部分。第一个部分为指令 [01-[03,用于M现场(即,例程会用到的三个寄存器r3、 r4、 r5的初 值)。第二个部分为指令04-[11,用于记录目标代码块303中存储器访问 指令"lwz r3, 72(r3)"和"lwz r4, 80(r4)"的存储器访问的有关信息。第 三个部分是指令[12-[14,用于恢复所保存的现场。
在进一步的优选实施例中,上述至少两个存储器访问指令的要访问的 存储器地址采用相同的寄存器来寻址。另外或可选地,对于上述至少两个 存储器访问指令的跟踪例程,可以进行优化以尽可能共享寄存器,以减少 保护和恢复现场的负载。
虽然在前面的说明中将本发明描述为用于计算机软件测试和调试领 域,然而本发明同样也适用于其它需要进行存储器访问跟踪的领域,例如 体系结构设计和性能优化。例如,本发明可应用于体系结构设计中广泛使 用的模拟器,以进行存储器访问跟踪。再例如,本发明也可应用于性能分 析(profile)驱动的优化技术,以进行存储器访问,来提供存储器性能分析数据。
上述系列处理和装置处理模块可以通过单一处理设备或多个处理 设备来实现。这样的处理设备可以是微处理器、微控制器、数字处理 器、微型计算机、中央处理单元的部分、状态机、逻辑电路及/或操作 信号的任何设备。
另夕卜,还应该指出的是,上述系列处理和装置也可以通过软件和固件 实现。在通过软件或固件实现的情况下,^储介质或网络向具有专用硬
件结构的计算机,例如图4所示的通用计算机400安装构成该软件的程序, 该计算机在安装有各种程序时,能够执行各种功能等等。
在图4中,中央处理单元(CPU)401根据只读存储器(ROM)402中存 储的程序或^储部分408加载到随MM储器(RAM)403的程序执行 各种处理。在RAM 403中,也根据需要存储当CPU 401执行各种处理等 等时所需的数据。
CPU 401、 ROM 402和RAM 403经由总线404彼此连接。输川输 出接口 405也连接到总线404。
下述部件连接到输"输出接口 405:输入部分406,包括M、鼠标 等等;输出部分407,包括显示器,比如阴;fel射线管(CRT)、液晶显示器 (LCD)等等,和扬声器等等;存储部分408,包括硬盘等等;和通信部分 409,包括网络接口卡比如LAN卡、调制解调器等等。通信部分409经由 网络比如因特网执行通信处理。
根据需要,驱动器410也连接到输X/输出接口 405。可拆卸介质411 比如磁盘、光盘、磁光盘、半导体存储器等等根据需要被安装在驱动器 410上,使得从中读出的计算机程序根据需要被安装到存储部分408中。
在通过软件实现上述系列处理的情况下,从网络比如因特网或存储介 质比如可拆卸介质411安装构成软件的程序。
本领域的技术人员应当理解,这种存储介质不局限于图4所示的其中 存储有程序、与设备相分离地分发以向用户提供程序的可拆卸介质411。 可拆卸介质411的例子包含磁盘(包含软盘)、光盘(包含光盘只读存储器 (CD-ROM)和数字通用盘(DVD))、磁光盘(包含迷你盘(MD))和半导体存 储器。或善,存储介质可以是ROM 402、存储部分408中包含的硬盘等 等,其中存有程序,并且与包含它们的设备一起被分发给用户。
还需要指出的是,执行上述系列处理的步骤可以自然地按照说明的顺序按时间顺序执行,但是并不需要一定按照时间顺序执行。某些步骤可以 并行或彼此独立地执行。
虽然已经详细说明了本发明及其优点,但M当理解在不退出由所附 的权利要求所限定的本发明的精神和范围的情况下可以进行各种改变、替 代和变换。而且,本申请的范围不仅限于说明书所描述的过程、设备、制 造、物质的结构、手段、方法和步骤的具体实施例。本领域内的普通技术 人员从本发明的公开内容将容易理解,根据本发明可以使用执行与在此所 述的相应实施例^g^M目同的功能或者获得与其基^M目同的结果的、现有和 将来要被开发的过程、设备、制造、物质的结构、手段、方法或者步骤。 因此,所附的权利要求旨在它们的范围内包括这样的过程、设备、制造、 物质的结构、手段、方法或者步骤。
权利要求
1. 一种代码修改方法,用于修改程序的目标代码以允许存储器访问跟踪,包括识别目标代码中要循环执行的目标代码块;识别目标代码块中在目标代码块的循环执行期间要访问的存储器地址不发生改变的至少一个存储器访问指令;和将用于跟踪所述至少一个存储器访问指令所要进行的存储器访问的例程插入在目标代码块之外。
2. 如权利要求1所述的代码修改方法,其中所述至少一个存储器访 问指令包括至少两个存储器访问指令,所述插入包括插入用于M插入位置的当前执行现场的指令;插入用于记录所述至少 一个存储器访问指令所要进行的存储器访问 的跟踪所需的信息的指令;和插入用于恢复所M的当前执行现场的指令。
3. 如权利要求1或2所述的代码修改方法,其中所述至少一个存储 器访问指令的要访问的存储器地址的寻址模式包括直接寻址、寄存器间接 寻址、寄存器相对寻址、基址加变址寻址和相对基址加变址寻址中的一种 或多种。
4. 如权利要求3所述的代码修改方法,其中所述至少一个存储器访 问指令的要访问的存储器地址采用相同的寄存器来寻址。
5. 如权利要求1所述的代码修改方法,其中所述例程被插入在目标 代码块之后。
6. —种代码修改设备,用于修改程序的目标代码以允许存储器访问 跟踪,包括循环识别装置,被配置为识别目标代码中要循环执行的目标代码块;指令识别装置,被配置为识别目标代码块中在目标代码块的循环执行 期间要访问的存储器地址不发生改变的至少一个存储器访问指令;和插入装置,被配置为将用于跟踪所述至少一个存储器访问指令所要进 行的存储器访问的例程插入在目标代码块之外。
7. 如权利要求6所述的代码修改设备,其中所述至少一个存储器访 问指令包括至少两个存储器访问指令,所述插入装置进一步被配置为插入 用于M插入位置的当前执行现场的指令,插入用于记录所述至少一个存 储器访问指令所要进行的存储器访问的跟踪所需的信息的指令,并且插入 用于恢复所M的当前执行现场的指令。
8. 如权利要求6或7所述的代码修改设备,其中所述至少一个存储 器访问指令的要访问的存储器地址的寻址模式包括直接寻址、寄存器间接 寻址、寄存器相对寻址、基址加变址寻址和相对基址加变址寻址中的一种 或多种。
9. 如权利要求8所述的代码修改设备,其中所述至少一个存储器访 问指令的要访问的存储器地址采用相同的寄存器来寻址。
10. 如权利要求6所述的代码修改设备,其中所述插入装置进一步被 配置为将所述例程插入在目标代码块之后。
全文摘要
代码修改方法和代码修改设备,用于修改程序的目标代码以允许存储器访问跟踪。代码修改方法包括识别目标代码中要循环执行的目标代码块;识别目标代码块中在目标代码块的循环执行期间要访问的存储器地址不发生改变的至少一个存储器访问指令;和将用于跟踪所述至少一个存储器访问指令所要进行的存储器访问的例程插入在目标代码块之外。
文档编号G06F11/36GK101546287SQ20081008408
公开日2009年9月30日 申请日期2008年3月26日 优先权日2008年3月26日
发明者武 周 申请人:国际商业机器公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1